Страницы

Поиск по вопросам

пятница, 12 октября 2018 г.

Java. Поиск в многострочном тексте при помощи регулярного выражения

Доброго времени суток, в Java я новичок, поэтому тапками не кидайте, если спрашиваю очевидную вещь. Однако, гугл мне в моём вопросе не смог помочь. Есть текст вида:
"Белеет парус одинокой В тумане моря голубом!.. Что ищет он в стране далекой? Что кинул он в краю родном?..."
И тут у меня возникает два вопрос: 1) Как поместить этот текст в одну переменную. 2) Если это невозможно (размещение многострочного текста в переменной), то как реализовать поиск по регулярке, если, к примеру мне требуется данный отрывок:
голубом!.. Что
Т.е. должно срабатывать регулярное выражение вида:
[а-я]+[!.]+
[а-яА-Я]+


Ответ

Массивы текстовых данных, в т. ч. состоящие из отдельных строк, могут существовать в Java как в виде наборов строковых элементов (массив, ArrayList и т.п.), так и в виде отдельной строки, содержащей символы перенеоса строк ("
" или "
", в зависимости от системы). Если данные читаются из файла, то, как правило, они читаются методом readLine() одного из классов-потомков Reader , по одной строке за раз, и в этом случае со строками можно поступать как с элементами массива.
Если текст хранится в виде набора строк, то все эти строки можно объединить используя StringBuilder (последовательно в цикле добавляя к нему строку за строкой) или методом String.join(). Второй вариант может быть чуть удобнее, но он может оказаться дороже в смысле памяти и быстродействия.
Когда строки объединены тем или иным способом, можно использовать регулярку для поиска в объединенной строке. Пример кода ниже показывает объедининие строк обоими методами и описание единой строки, содержащей символы переноса строк.
import java.util.regex.Matcher; import java.util.regex.Pattern;
public class Ru_So_756552 {
public static String[][] testData = {
{ "Белеет парус одинокой
" + // array of 1 string "В тумане моря голубом!..
" + "Что ищет он в стране далекой?
" + "Что кинул он в краю родном?..." },
{ "Мой дядя самых честных правил,
" + "Когда не в шутку занемог,
" + "Он уважать себя заставил
" + "И лучше выдумать не мог" },
{ "Белеет парус одинокой", // Array of 4 strings "В тумане моря голубом!..", "Что ищет он в стране далекой?", "Что кинул он в краю родном?..." },
};
public static void main(String[] args) { Pattern pattern = Pattern.compile("([\\wА-Яа-я]+!\\.{2}\
[\\wА-Яа-я]+)"); for (String[] data: testData) {
System.out.println("*** Data:"); StringBuilder sb = new StringBuilder(); for (String s: data) { System.out.println(s); sb.append(s + "
"); // Concatenate using StringBuilder }
String joint = String.join("
", data); // Concatenate using join() System.out.println("*** Joint data:
" + joint);
Matcher m = pattern.matcher(sb); System.out.println("*** Found:
" + (m.find()? m.group(1) : "nothing... :(")); m = pattern.matcher(joint); System.out.println("*** Found in joint:
" + (m.find()? m.group(1) : "nothing... :(") + "
");
} // for (String[] data: testData) { } // public static void main(String[] args) {
} // public class Ru_So_756552

Комментариев нет:

Отправить комментарий