С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
2 / 2 / 0
Регистрация: 22.12.2017
Сообщений: 34

Работа над текстом с помощью регулярных выражений

14.10.2018, 04:21. Показов 3409. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, форумчане. Подскажите в чём проблема.

Мне нужно в тексте после точки с пробелом, восклицательного или вопросительного знака перевести строку на новый абзац.

Например, из "Всем привет! Я приложение, написанное на Java. Можете меня починить?" должно получится:

"Всем привет!
Я приложение на Java.
Можете меня починить?

Работаю с таким текстом в качестве примера:"Отчего люди не летают?... " +
"Я говорю, отчего люди не летают так, как птицы? Знаешь, мне " +
"иногда кажется, что я птица. Когда стоишь на горе, так тебя и тянет лететь. " +
"Вот так бы разбежалась, подняла руки и полетела.";

Набросал функцию, но проблема в том, что при выводе текста данные знаки убираются
Java
1
2
3
4
5
6
static void sentence_refractor(String text)
    {
        String regex = "[.!?]\\s+";
        text = Pattern.compile(regex).matcher(text).replaceAll("\n");
        System.out.print(text);
    }
И еще одна проблемка, которую я не знаю как исправить.
После разбиение на абзацы мне нужно поменять первое и последнее слова в тексте на нижний регистр. Если в качестве параметра передавать text.ToLowerCase, то на выводе получается заменённая строка вместо первого найденного символа, а следом исходный текст.

Java
1
2
3
4
5
6
7
8
static void word_lowcase(String text)
    {
        String begin_regex = "^\\w";
        String end_regex = "\\w$";
        text = Pattern.compile(begin_regex).matcher(text).replaceFirst(?????);
        text = Pattern.compile(end_regex).matcher(text).replaceFirst(?????);
        System.out.println(text);
    }
А про вот это я вообще без понятия. Может вы подкинете идею либо какой-нибудь код на коленке?
3) Определите количество слов заданного по номеру абзаца, которые содержат сочетание подстроку "ам".
4) Сформируйте новую строку, включив в нее текст: Количество слов в предложении = укажите их число.

Стоит ли вообще пытаться делать это с помощью Pattern-а или лучше сплитовать строку?

Заранее спасибо за помощь

P.S. Просто горит лаба в универе, а я без понятия как это всё решить
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.10.2018, 04:21
Ответы с готовыми решениями:

Калькулятор с помощью регулярных выражений
Здравствуйте. Мне необходимо написать программу-калькулятор на Borland C++ Builder с использованием регулярных выражений. Тема...

Разобрать строку с помощью регулярных выражений
Здраствуйте. Думаю многим приходилось сталкиваться с древовидной структурой каталогов....

Распарсить Html с помощью регулярных выражений
Здравствуйте,вроде есть много всего по данной теме,но вопрос остался. Нужно с помощью регулярных выражения вытащить данные из тэга body...

11
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
14.10.2018, 10:27
Лучший ответ Сообщение было отмечено Reywal как решение

Решение

Цитата Сообщение от Reywal Посмотреть сообщение
проблема в том, что при выводе текста данные знаки убираются
Java
1
2
3
4
5
6
7
8
9
String s = "Всем привет! Я приложение, написанное на Java. Можете меня починить?";
 
        Pattern p = Pattern.compile("([.?!]\\s*)");
        Matcher m = p.matcher(s);
        StringBuffer result = new StringBuffer();
        while (m.find()) {
            m.appendReplacement(result, m.group() + "\n");
        }
        System.out.println(result);
Bash
1
2
3
Всем привет! 
Я приложение, написанное на Java. 
Можете меня починить?
Добавлено через 14 минут
Java
1
System.out.println("Количество слов в предложении " + s.split("([.?,!\\s]\\s*)").length);
Добавлено через 1 минуту
Цитата Сообщение от Reywal Посмотреть сообщение
заданного по номеру абзаца
ИМХО, разбить исходный текст по абзацам, сложить их в лист и потом изгаляться над ними как угодно...
0
2 / 2 / 0
Регистрация: 22.12.2017
Сообщений: 34
14.10.2018, 15:49  [ТС]
А если ли возможность реализовать без класса StringBuffer? У меня просто по заданию нужно использовать только String для работы со строками, ну и Pattern с Matcher для регулярок
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
14.10.2018, 20:44
Цитата Сообщение от Reywal Посмотреть сообщение
если ли возможность
Да не вопрос
Java
1
2
3
4
5
String s = "Всем привет! Я приложение, написанное на Java. Можете меня починить?";
        Pattern p = Pattern.compile("([.?!]\\s*)");
        Matcher m = p.matcher(s);
        String result = m.replaceAll("$1\n");
        System.out.println(result);
0
2 / 2 / 0
Регистрация: 22.12.2017
Сообщений: 34
15.10.2018, 20:23  [ТС]
Окей, понял. Спасибо. Слушай, а можно ли как-то сделать обратное действие методу split?

Я просто разбил свою строку по пробелам.
Java
1
2
3
4
5
6
7
static void word_tolow(String text)
    {
        String[] new_text = text.split("\\s");
        new_text[0] = new_text[0].toLowerCase();
        new_text[new_text.length-1] = new_text[new_text.length-1].toLowerCase();
        System.out.print(new_text[3]);
    }
Сделал перевод в нижний регистр определённых слов, а можно ли теперь записать в исходную строку результат всего этого в таком же формате как ты мне писал в последнем сообщении?
Цитата Сообщение от iSmokeJC Посмотреть сообщение
String s = "Всем привет! Я приложение, написанное на Java. Можете меня починить?";
Pattern p = Pattern.compile("([.?!]\\s*)");
Matcher m = p.matcher(s);
String result = m.replaceAll("$1\n");
System.out.println(result);
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
15.10.2018, 20:32
Reywal, вот тебе примерчик, используй
Java
1
2
3
String[] words = {"adsad", "sfsdfsd", "AsafsAF", "FFVVsdV"};
        String res = String.join(", ", words);
        System.out.println(res);
Добавлено через 4 минуты
Если сплитовал по пробелам, тогда и в джоине используй пробел
0
2 / 2 / 0
Регистрация: 22.12.2017
Сообщений: 34
15.10.2018, 21:03  [ТС]
Я так пытался делать, то если потом выводить через первую функцию, то он снова возвращает строку с исходными данными, которые я вводил в начале.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package Application;
 
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.Scanner;
 
public class Lab_2
{
    public static void main(String[] args)
    {
        String text = "Это было на рассвете. Я стоял на назначенном месте с моими тремя секундантами. С неизъяснимым нетерпением ожидал я моего ПРИЯТЕЛЯ.";
        Scanner input = new Scanner(System.in);
        int choice;
        output_menu();
        do {
            choice = input.nextInt();
            switch (choice)
            {
                case 1:
                    System.out.println(text_refactor(text));
                    break;
                case 2:
                    System.out.println(word_to_low(text));
                    break;
                case 3:
                    output_menu();
                case 0:
                    System.out.println("Выход из программы");
                    break;
            }
        }while(choice!=0);
    }
 
    static void output_menu()
    {
        System.out.println("1) Разбиение на абзацы");
        System.out.println("2) Замена первого и последнего слова на прописные буквы");
        System.out.println("3) Меню");
        System.out.println("0) Выход");
    }
    static String text_refactor(String text)
    {
        Pattern pattern = Pattern.compile("([.?!]\\s*)");
        Matcher match = pattern.matcher(text);
        text = match.replaceAll("$1\n");
        return text;
    }
 
    static String word_to_low(String text)
    {
        String[] new_text = text.split("\\s");
        new_text[0] = new_text[0].toLowerCase();
        new_text[new_text.length-1] = new_text[new_text.length-1].toLowerCase();
        text = String.join(" ", new_text);
        return text;
    }
}
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
15.10.2018, 21:08
Цитата Сообщение от Reywal Посмотреть сообщение
System.out.println(text_refactor(text));
Ты же просто выводишь результат работы метода. Переменная не меняется. Юзай
Java
1
2
text = text_refactor(text);
System.out.println(text);
Ну и т.д.
0
2 / 2 / 0
Регистрация: 22.12.2017
Сообщений: 34
15.10.2018, 22:02  [ТС]
Ага, понял, спасибо.

Можешь сказать в чем здесь косяк? Мне нужно сформировать новую строку с заданным количеством слов

Набросал такой функцию, но проблема в том, что он выводит строку только цифру с таким индексом, а если убрать индекс у split-а, то он просто записывает исходную строку
Java
1
2
3
4
5
6
7
8
9
10
11
   static String form_sentence(String text, int num)
    {
        int count = 0;
        String new_string = "";
        String[] new_text = text.split(" ");
        for(int i = 0; i < num; i++)
        {
            new_string = String.join(" ",new_text[i]);
        }
        return new_string;
    }
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
15.10.2018, 22:16
Java
1
String new_string = Arrays.stream(new_text).limit(num).collect(Collectors.joining(" "));


Добавлено через 7 минут
Ежели по простому, перебирай массив в цикле и добавляй то, что нужно в StringBuilder.
0
2 / 2 / 0
Регистрация: 22.12.2017
Сообщений: 34
15.10.2018, 22:18  [ТС]
Работает, но можно ещё вот так фигануть

Java
1
2
3
4
5
6
7
8
9
10
11
  static String form_sentence(String text, int num)
    {
        int count = 0;
        String new_string = "";
        String[] new_text = text.split(" ");
        for(int i = 0; i < num; i++)
        {
            new_string += String.join(" ", new_text[i]) + " " ;
        }
        return new_string;
    }
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
15.10.2018, 22:26
Reywal, можно. Только вот эта конструкция
Цитата Сообщение от Reywal Посмотреть сообщение
String.join(" ", new_text[i])
вообще ничего не делает.
Понимаешь вообще смысл метода джоин? Склеивает. А что тут склеивать? Один элемент?
Тогда уж
Java
1
new_string += new_text[i] + " " ;
Только в этом случае при каждой итерации создается новая строка. Не комильфо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.10.2018, 22:26
Помогаю со студенческими работами здесь

Парсинг HTML с помощью регулярных выражений
имеем строку(вернее табличку): &lt;table class=&quot;mesview&quot; &gt;&lt;tr&gt;&lt;td&gt;Тип сообщения&lt;/td&gt;&lt;td&gt;О стоимости чистых...

Распарсить HTML с помощью регулярных выражений
Есть строка такая: &lt;meta name=&quot;description&quot; content=&quot;Лаборатория измерений в институте&quot;&gt; Необходимо переделать регулярное выражение,...

Проверка строки с помощью регулярных выражений
Сделал простейшую форму с TextBox и кнопкой. Нужно сделать чтобы при нажатие на кнопку проверялось содержимое TextBox регулярным...

Удаление подстроки с помощью регулярных выражений
using System; using System.Collections.Generic; using System.Linq; using System; using System.Collections.Generic; using...

Удалить комментарии с помощью регулярных выражений
Нужно почистить файл (кода) от комментариев. В одной из строк есть Console.WriteLine(&quot;/*dfsdf*////****/**//**Hello, world!\&quot;);/**/ // ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru