2 / 2 / 0
Регистрация: 22.12.2017
Сообщений: 34

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

14.10.2018, 04:21. Показов 3459. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru