Как сказать RegEx быть жадным к выражению «Или» - PullRequest
0 голосов
/ 08 октября 2018

Текст:

[A]I'm an example text [] But I want to be included [[]]
[A]I'm another text without a second part []

Регулярное выражение:

\[A\][\s\S]*?(?:(?=\[\])|(?=\[\[\]\]))

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

Демонстрация

Есть ли способ сказать регулярному выражению, что он жадный в части 'or'?Я хочу захватить самую большую возможную группу.

Редактировать 1:

Исходная попытка:

Демо

Редактировать 2:

То, что я хочу достичь:

В нашей компании мы используем веб-сервис для отчета о нашем рабочем времени.Я хочу разработать настольное приложение, чтобы легко следить за рабочим временем.Я успешно загрузил ответ сервера (со всеми необходимыми данными), но, к сожалению, эта дата находится в очень плохом состоянии для его обработки.

Поэтому мне нужно разбить всю страницу на разные дни.К сожалению, один день может иметь несколько наборов времени, например, 06:05 - 10:33;10:55 - 13:13.Вышеупомянутое регулярное выражение разделяет набор данных дней после первого установленного времени (то есть после 10:33).Поэтому я хочу, чтобы регулярное выражение обрабатывало часть Or «жадным» (если выражение 1 (большее) истинно, пропустите второе выражение. Если выражение 1 ложно, используйте второе).

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Я изменил ваше регулярное выражение (на самом деле проще), чтобы сделать то, что вы хотите:

\[A\].*\[?\[\]\]?

Он начинается с совпадения с [A], затем сопоставляется с любым количеством любых символов (жадных) и, наконец,один или два '[]'.

Редактировать :

Предпочитают двойные квадратные скобки:

\[A\].*(?:\[\[\]\]|\[\])
0 голосов
/ 08 октября 2018

Вы можете использовать

\[A][\s\S]*?(?=\[A]|$)

См. Демоверсию regex .

Подробности

  • \[A] - подстрока [A]
  • [\s\S]*? - любые 0+ символов, как можно меньше
  • (?=\[A]|$) - местоположение, за которым сразу следует [A] или конец строки.

В C # вы даже можете использовать операцию разбиения:

Regex.Split(s, @"(?!^)(?=\[A])")

См. Это .NET regex demo .Регулярное выражение (?!^)(?=\[A]) соответствует местоположению в строке, которое не находится в начале и за которым сразу следует [A].

Если вместо A может быть любая буква, то вместо A[A-Z] или [A-Z]+.

enter image description here

...