Regex для разделения строки на шаблон, но с минимальным количеством символов - PullRequest
0 голосов
/ 06 ноября 2018

Я хочу разбить длинный текст, хранящийся в строковой переменной, следуя этим правилам:

  1. Разделить на точку (.)
  2. Подстроки должны иметь минимальную длину 30 (например).

Возьмите этот пример:

"The boy ate the apple. The sun is shining high in the sky. The answer to life the universe and everything is forty two, said the big computer."

скажем, минимальная длина, которую я хочу, составляет 30.

В результате будет получено следующее разбиение:

  • «Мальчик съел яблоко. Солнце светит высоко в небе».
  • «Ответ жизни вселенной и всему сорок два, - сказал большой компьютер».

Я не хочу принимать "Мальчик съел яблоко". как разделение, потому что это менее 30 символов.

2 способа, о которых я думал:

  1. Переберите всех персонажей и добавьте их в String Builder. И всякий раз, когда я достигаю точки (.), Я проверяю, больше ли мой String компоновщик, чем минимум, который я делю, иначе я продолжаю.
  2. Разделить все точки (.), А затем выполнить цикл через разбиения. если одна из строк Splitted меньше минимальной, я объединяю ее со строкой после.

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

Спасибо

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Вместо использования метода split попробуйте , сопоставив со следующим регулярным выражением: \S.{29,}?[.]

Демо

0 голосов
/ 07 ноября 2018

Вместо использования разделения можно также сопоставить свои значения с помощью группы захвата. Чтобы сделать точку также совпадающей с новой строкой, вы можете использовать Pattern.DOTALL

\s*(.{30}[^.]*\.|.+$)

В Java:

String regex = "\\s*(.{30}[^.]*\\.|.+$)";

Объяснение

  • \s* Соответствует 0_ раз символу пробела
  • ( Захватывающая группа
    • .{30} Совпадение с любым персонажем 30 раз
    • [^.]* Совпадение 0+ раз, а не точка с использованием отрицательного класса символов
    • \. Совпадение буквально
    • | или
    • .+$ Соответствует 1+ раз любому символу до конца строки.
  • ) Закрыть группу захвата

Regex demo | Java демо

0 голосов
/ 06 ноября 2018

Это должно сделать работу:

"\W*+(.{30,}?)\W*\."

Тест: https://regex101.com/r/aavcme/3

  • \W*+ требуется столько же, сколько и несловарный символ, чтобы сократить пробелы между предложениями
  • . соответствует любому символу (полагаю, вы хотите сопоставить любой символ в ваших предложениях)
  • {30,} утверждает минимальную длину матча (30)
  • ? означает «как можно меньше»
  • \. соответствует точке, разделяющей предложения (при условии, что у вас всегда есть точка в конце предложения, даже в последнем)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...