Проблема с поиском позади регулярных выражений Java с квантификаторами

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

Я пытаюсь извлечь значения из моего образца текста:

C02 SURVEY  : 2010 F10446P BONAPARTE 2D 

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

2010 F10446P БОНАПАРТ 2D

Я использовал шаблон (?<=(?i)survey\s{2}[:])(?:(?![\n]).)*

В этом шаблоне я жестко запрограммировал пробелы равными 2 (\s{2}), которые могут варьироваться, а не постоянное значение.

Мне нужно использовать квантификаторы с операцией просмотра назад.

Если есть какой-либо другой вариант, пожалуйста, дайте мне знать.


person DeviN    schedule 01.06.2017    source источник
comment
Удалите ретроспективный просмотр и используйте группу захвата для шаблона, который необходимо извлечь. Кстати, точка не соответствует новой строке. Используйте 1_   -  person Wiktor Stribiżew    schedule 01.06.2017
comment
Что такое движок регулярных выражений?   -  person Wiktor Stribiżew    schedule 01.06.2017
comment
Мое приложение, в свою очередь, использует java для извлечения совпадения. Таким образом, будет возвращено полное совпадение.   -  person DeviN    schedule 01.06.2017
comment
Lookbehinds в Java не поддерживает шаблоны бесконечной ширины, но поддерживает предопределенные ограничения: (?i)(?<=survey\s{1,999}:).*   -  person revo    schedule 01.06.2017
comment
@DeviN Пожалуйста, уточните. Вы используете его в коде Java или в каком-то приложении, которое возвращает только значение нулевого совпадения всей группы?   -  person Wiktor Stribiżew    schedule 01.06.2017
comment
@WiktorStribiżew Я использую его в приложении, которое возвращает только нулевое совпадение группы   -  person DeviN    schedule 01.06.2017
comment
Хорошо, тогда попробуйте (?i)(?<=survey\s{0,100}:).*, чтобы сопоставить ноль или более символов после survey и от нуля до 100 пробелов, за которыми следует :. Если это механизм регулярных выражений Java, он должен поддерживать квантификаторы ограничения в ретроспективе.   -  person Wiktor Stribiżew    schedule 01.06.2017
comment
@ВикторСтрибижев. С предопределенными ограничениями он работает сейчас. Спасибо.   -  person DeviN    schedule 01.06.2017
comment
@revo Как вы сказали, Java не поддерживает бесконечную ширину. Но с предопределенными ограничениями это сработало. Спасибо   -  person DeviN    schedule 01.06.2017
comment
@DeviN: я опубликовал ответ с пояснениями.   -  person Wiktor Stribiżew    schedule 01.06.2017


Ответы (1)


Вы можете использовать функцию движка регулярных выражений Java, которая называется "ограниченный поиск по ширине ":

Java принимает квантификаторы в ретроспективном просмотре, если длина совпадающих строк находится в заранее определенном диапазоне. Например, (?<=cats?) действителен, потому что он может соответствовать только строкам из трех или четырех символов. Аналогично, (?<=A{1,10}) допустимо.

Это означает, что вы можете заменить ограничительный квантификатор {2} на ограничительный квантификатор с минимальным и максимальным значениями, например {0,100}, чтобы разрешить от нуля до ста символов пробела. Отрегулируйте их так, как считаете нужным.

Кроме того, вам не нужно использовать умеренный жадный токен (?:(?![\n]).)*, поскольку точка в регулярном выражении Java не соответствует новой строке. Просто замените его на .*, чтобы соответствовать любому нулю или более символов, кроме новой строки. Таким образом, ваш шаблон может выглядеть так же просто, как (?i)(?<=survey\s{0,100}:).*.

person Wiktor Stribiżew    schedule 01.06.2017