Задать вопрос
Alexeytur
@Alexeytur

Сложная регулярка для поиска и замены в строке?

Добрый день.

У меня есть задача - в строке найти предложения, содержащие определенное слово, и только это предложение заменить на фразу.

Регулярное выражение получилось такое (границы предложения ищу грубо по символам . ? !):
(?i)(?<=([\.\?!]|^))[^\.\?!]*СЛОВО[^\.\?!]*(?=([\.\?!]|$))


Сейчас появилось условие, что нужно исключить из замены предложения, в которых перед СЛОВО есть СЛОВО2. И с этим у меня проблемы. Такая регулярка не работает:
(?i)(?<=([\.\?!]|^))[^\.\?!]*(?<!СЛОВО2)[^\.\?!]*СЛОВО[^\.\?!]*(?=([\.\?!]|$))


Можно ли вообще это сделать?

И я делаю это на SQL, возможно лучше переделать с регулярных выражений на циклы?
  • Вопрос задан
  • 123 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
Alexandroppolus
@Alexandroppolus
кодир
(?<=^|[.?!])(?![^.?!]*?\bslovo2\b[^.?!]+?\bslovo\b)[^.?!]*?\bslovo\b[^.?!]*


если проверяемые слова кириллические, то заменить все \b перед/после них на (?<![a-zа-яё0-9]) или (?![a-zа-яё0-9]) соответственно.

пояснение:

(?<=^|[.?!]) - перед началом искомого матча стоит конец пред. предложения или начало строки

(?![^.?!]*?\bslovo2\b[^.?!]+?\bslovo\b) - матч не содержит slovo2, после которого есть slovo

[^.?!]*?\bslovo\b[^.?!]* - матч содержит slovo
Ответ написан
@dodo512
(?<=[.?!]|^)(?:СЛОВО2()|СЛОВО()(?:\1())?|[^.?!])++\2(?!\3)

https://regex101.com/r/XvBSqV/1
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы