Проблема с регулярным выражением в Java (отрицательный взгляд вперед и назад) - PullRequest
1 голос
/ 18 октября 2019

Мне нужна ваша помощь, ребята! Это сложная проблема с Java-регулярным выражением, которая искала решение в течение пары часов ... Вот оно:

В следующем тексте я хочу найти слово "лодка" ...

  1. и включить «связку», если место перед ним.
  2. и включить «пропеллер», если место сразу после него.
  3. или не совпадать, если ему предшествует «»для "даже с" кучей "между ними.
  4. или не совпадать, если за ним следует" трейлер ", даже с" пропеллером "между ними.

У меня есть лодка, чтобы продать. Он поставляется с дополнительными гребными винтами, но не поставляется с лодочным прицепом (лодка довольно большая, поэтому вам также может понадобиться лодочный прицеп). Раньше у меня была куча лодок, но моя страсть к лодке со временем угасла. Я не думал, что люди будут интересоваться кучей лодок, но это моя последняя, ​​так что вы! :)

Следующие части должны совпадать:

  • лодка ("лодка")
  • связка лодок («лодке» предшествует «связка»)
  • гребной винт ("лодка, за которой следует" пропеллер ")

Следующие части НЕ должны совпадать (даже частично):

  • для лодки ("лодка", перед которой стоит "за")
  • прицеп для лодки ("лодка с" прицепом ")
  • для группы лодок («лодке» предшествует «куча», за которой следует «для»)
  • лодочный прицеп («лодка», затем «пропеллер», за которым следует «трейлер»)

Я получил этот пример настройки в регулярном выражении 101 (https://regex101.com/r/o6S4SP/22), но этоне работает должным образом: - (

PS: я использую Regex101 для примера, но "(SKIP) (FAIL)" не поддерживается в синтаксисе регулярных выражений Java.

Надеюсь, кто-нибудь может помочь: -)

1 Ответ

0 голосов
/ 21 октября 2019

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

(?<!\bfor\sa\s(?:bunch\sof\s){0,1})(?:\bbunch\s+of\s+)?\bboats?\b(?:\s+propellers?)?+(?!\s+trailers?\b)

См. Регулярное выражение Javaдемоверсия онлайн (пробная версия) .

На Java

s = s.replaceAll("(?<!\\bfor\\sa\\s(?:bunch\\sof\\s){0,1})(?:\\bbunch\\s+of\\s+)?\\bboats?\\b(?:\\s+propellers?)?+(?!\\s+trailers?\\b)", "<b>$0</b>");

Regex details

  • (?<!\bfor\sa\s(?:bunch\sof\s){0,1})- отрицательный взгляд сзади, который не соответствует совпадению, если непосредственно слева от текущего местоположения есть
    • \bfor\sa\s - for, пробел, a, пробел
    • (?:bunch\sof\s){0,1} - 0 или 1 вхождение (т. Е. Необязательное вхождение): bunch, пробел, of, пробел
  • (?:\bbunch\s+of\s+)? - необязательное вхождение bunch, 1+пробелы, of, 1+ пробелы
  • \bboats?\b - целое слово boat или boats
  • (?:\s+propellers?)?+ - необязательное вхождение 1+ пробелов, сопровождаемое propeller или propellers. ПРИМЕЧАНИЕ : квантификатор ?+ является ключевым здесь для того, чтобы следующий просмотр выполнялся только после этого шаблона группы.
  • (?!\s+trailers?\b) - отрицательный просмотр, который завершается неудачно, если сразусправа от текущего местоположения есть 1+ пробелов, а затем trailer или trailers как целое слово.
...