Regex Negate non-contiguous Pattern

Я хочу сопоставить слово флис, где за ним НЕ следует (сразу или далее) слово снег

Входные данные:

Mary had a little lamb, its fleece was white as snow balls

Следующие регулярные выражения не работают, поскольку все они совпадают, и не должны. Я уверен, что достиг этого в прошлом, но не могу найти где.

/(fleece).*(?!snow)/
/(fleece)[\w ]+(?!snow)/

Для информации, это регулярное выражение будет частью большего регулярного выражения и будет разделом чередования, поэтому я не могу просто отрицать все регулярное выражение - например,

/something(?!somethingelse)|fleece.*(?!snow)/

person Santrix    schedule 27.01.2015    source источник
comment
На каком языке ты говоришь?   -  person shree.pat18    schedule 27.01.2015


Ответы (1)


Ты почти там . Поместите .* в отрицательный прогноз. Приведенное ниже регулярное выражение захватит строку fleece только в том случае, если за ней не следует .*? любой символ, равный нулю или более раз, и строка snow.

(fleece)(?!.*?snow)

OR

При необходимости используйте границу слова \b.

\b(fleece)\b(?!.*?\bsnow\b)

ДЕМО

person Avinash Raj    schedule 27.01.2015
comment
но это something(?!somethingelse) проверяет наличие следующего. - person Avinash Raj; 27.01.2015
comment
Вы можете удалить "?" после. *: (fleece)(?!.*snow) - person griffon vulture; 27.01.2015
comment
Не совсем, ? заставляет его возвращаться после каждого символа после fleece до встречи snow; его удаление приводит к возврату после каждого символа при возвращении от конца строки к слову snow - вопрос в том, какой путь короче. Если вы не можете с уверенностью сказать, что snow будет ближе к fleece, чем к концу строки, нет веских причин оставлять ? внутри. - person Tim Pietzcker; 27.01.2015
comment
За деревьями леса не было видно. Спасибо за ответы. И совет по производительности полезен, и я не думал об этом. Итак, в моем случае слово снег БУДЕТ ближе к флису, чем к концу строки, поэтому лучше сделать его не жадным - т.е. (флис) (?!. *? Snow) - person Santrix; 27.01.2015