Regex, как получить 3 группы строк из нескольких строк - PullRequest
0 голосов
/ 05 мая 2019

Нужно получить 3 группы строк из нескольких строк с помощью регулярных выражений. Первая и последняя группы - это известное количество строк.Сумма может отличаться от списка к списку, но всегда известна.Группа в середине - это любое количество строк, оставшихся между ними.Текст всегда будет иметь по крайней мере количество строк верхней + нижней группы, поэтому нет необходимости проверять, достаточно ли строк

Я дошел до того, что показано в коде ниже, примененного кследующий пример текста:

This could
be "words"
or any text
or pattern
or any amount of lines
need 3 groups:
1 -> lines 1 to 2
2 -> lines leftover
3 -> last 3 lines

Чтобы добиться этого, я получил это далеко:

^((.*\n){1,2})(.*)((.*\n){0,2}.*\n?\z)

Но это не дает желаемых результатов

Ожидаемые результаты:

Группа 1 - это строки 1 и 2 Группа 3 - последние 3 строки. Группа 2 - строки, оставшиеся между

Фактические результаты можно увидеть здесь

1 Ответ

0 голосов
/ 05 мая 2019

Прежде всего, вы должны убрать флаг "m" и установить "s". Это позволит вам рассматривать весь текст как одну строку (а не как многострочный текст, где регулярное выражение применяется к каждой строке).

Во-вторых, выучите "несвободные" модификаторы. Выражение .*\n будет соответствовать всему тексту, потому что * является жадным, .*?\n будет соответствовать одной строке, потому что *? не является жадным.

В-третьих, этот онлайн-валидатор неверен, в частности, его поддержка числовых квантификаторов нарушена. Например, ^(.+?[\n]+){1}(.*?)$ правильно соответствует первой строке и остальным. Тем не менее, если я изменю на {2}, он будет соответствовать 2-й строке, а не двум первым.

Тем не менее, вы можете переписать без использования числовых квантификаторов:)

^([^\n]+?[\n][^\n]+?[\n])((?:[^\n]+?\n)*?)([^\n]+?[\n][^\n]+?[\n][^\n]+?[\n]*)$

Ссылка https://regex101.com/r/orjKVI/2

...