Как разделить текст с помощью регулярного выражения на Java?

57
4

Я ищу, как отделить текст в MAP в java. Например, у меня есть следующий текст:

2.10. Добавить параметр nodev для разделов съемных носителей (Scored). Описание профиля: Установите nodev на съемный носитель, чтобы предотвратить появление символа и блокировать специальные устройства, которые на съемном носителе обрабатываются как файлы устройств.

Поэтому я использовал следующий код, используя регулярное выражение:

    String text ="2.10 Add nodev Option to Removable Media Partitions (Scored)"
+"Profile Description:Set nodev on removable media to prevent character and "
+"block special devices that are present"
+", on the removable media from being treated as device files. ";
Map<String, List<String>> maps = new HashMap<>();
Pattern pattern = Pattern.compile("^((\\d+\\.)*?(\\d+)) .*$"); //To find out if there is, for example, 1.1.
Pattern pattern2 = Pattern.compile("[0-9].*?.*[0-9].*$");//To retrieve the title of the paragraph: 1.1. Add Nodev Option to Removable Media Scores
List<String> paragraphe = new ArrayList<>();
maps.put(null, paragraphe);

for(String ligne : text.split("\n")) {

Matcher matcher = pattern.matcher(ligne);
Matcher matcher2 = pattern2.matcher(ligne);

if ( matcher.matches() && matcher2.matches()) {

paragraphe = new ArrayList<>();
maps.put( matcher2.group(0), paragraphe);
paragraphe.add(ligne);
}
else {

paragraphe.add(ligne);
}

}
for (Entry<String, List<String>> key : maps.entrySet()) {
for (String strings : key.getValue()) {
if (strings.contains("(Scored)")) {
System.out.println("Key : " + key.getKey() + " Value : " + key.getValue());
}
}

}

Этот код отображает следующий результат:

Ключ: 2.10 Добавить параметр nodev для разделов съемных носителей (Scored)

Значение: [2.10 Добавить параметр nodev для разделов съемных носителей (Scored)

Описание профиля: Установите nodev на съемный носитель, чтобы предотвратить появление символов и блокировать специальные устройства, которые на съемном носителе обрабатываются как файлы устройств. ]

Но я хочу получить следующие результаты: ключ, содержащий заголовок (2.10 Добавить параметр nodev для разделов съемных носителей (Scored)) и значение их содержимого (Описание профиля: Установить nodev на съемном......):

Ключ: 2.10 Добавить параметр nodev для разделов съемных носителей (Scored)

Значение: [Профиль Описание: Установите nodev на съемный носитель, чтобы предотвратить символ и заблокировать специальные устройства, которые присутствуют, на съемном носителе, который обрабатывается как файлы устройства. ]

Кто-то может помочь мне получить правильный результат. спасибо

спросил(а) 2017-05-23T11:43:00+03:00 3 года, 5 месяцев назад
1
Решение
59

Я бы использовал одно регулярное выражение, представляющее три части абзаца, группируя их в своей собственной группе захвата:

((\d+(?:\.\d+)?)?.*\(Scored\))\n?(.*)

для использования с флагом DOTALL, поэтому

Pattern.compile("((\\d+(?:\\.\\d+)?)?.*\\(Scored\\))\\n?(.*)", Pattern.DOTALL)

Первая группа - это название, вторая группа - номер в начале заголовка, а третья - текст абзаца.

Я добавил \n? чтобы удалить ведущую линию подачи тела.

Вы можете попробовать его на regex101 или на ideone.

ответил(а) 2017-05-23T12:03:00+03:00 3 года, 5 месяцев назад
57

Если (Scored) - последнее слово в заголовке, а текст после - это абзац, затем измените ваши шаблоны регулярных выражений на:

    Для названия:

    ^((\d+\.)*?(\d+)).*\(Scored\)

    Добавлено \(Scored\) в конце, чтобы убедиться, что заголовок заканчивается (Scored)

    Для абзаца:

    (?<=\(Scored\) ).*$

    Добавлен положительный lookbehind (?<=\(Scored\) ) который гарантирует, что совпадению предшествует (Scored).

Демо-версия Regex101 для заголовка

Демо-версия Regex101 для Paragrapgh

ответил(а) 2017-05-23T11:59:00+03:00 3 года, 5 месяцев назад
41

Решение состоит в замене следующей строки:

Pattern pattern = Pattern.compile("^((\\d+\\.)*?(\\d+)) .*$");

от

Pattern.compile("((\\d+(?:\\.\\d+)?)?.*\\(Scored\\))\\n?(.*)", Pattern.DOTALL)

ответил(а) 2017-05-23T12:38:00+03:00 3 года, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема