Исключить слово между двумя другими как регулярное выражение

#java #regex #text

#java #регулярное выражение #текст

Вопрос:

У меня есть шаблон

 \bi\b[^.!?]{0,10}\bhate
  

которое соответствует строке только в одном предложении (не разделенном на .!? ). Но это также соответствует противоположному смыслу с not между двумя словами. Как исключить такие случаи not между двумя словами с максимальным расстоянием 10 между ними.

Теперь оно соответствует: i do not hate . Я хотел бы исключить это и оставить только такие совпадения, как i do hate или i hate .

Комментарии:

1. Это [^.!?]{0,10} должно быть между {1,10}

2. bib(?:(?!bnotb)[^.!?]){1,10}bhateb , демонстрация .

Ответ №1:

Вы бы исключили not в отрицательном утверждении,
адаптированном к длине NOT в пределах первых 10 символов.
Т.е. диапазон составляет 10 - length('not') или {0,7}

bib(?!.{0,7}not)[^.!?]{0,10}bhate

https://regex101.com/r/vdqBQX/1

  b i b                       # 'i'
 (?! .{0,7} not )              # Here, exclude 'not' if within the first 7 characters     
 [^.!?]{0,10} b               # O - 10 characters within this negated class
 hate
  

Комментарии:

1. спасибо за такие подробности, но длина в 3 цифры здесь для меня не так уж важна. Просто нужно исключить отрицание

2. @SergeyAleshkinAlyoshkin — Я не придал слишком большого значения длине 'not' ? Извините, но вы придали большое значение длине между словами between two words with maximum distance 10 between them . Возможно, вас не так сильно волнует длина между словами. Я думаю, вы могли бы просто сделать ^i (?!.*not).*hate$