Применение НЕ ограничения к шаблону регулярных выражений - PullRequest
0 голосов
/ 20 октября 2018

Я использую preg_replace_callback с шаблоном

preg_replace_callback('/^(word1 .*),(.*)\./i',
function($m){
processing $m[1] and $m[2]
}, $str);

, чтобы сопоставить предложение, начинающееся с word1.Как я могу изменить шаблон, чтобы установить ограничение для второго слова в шаблоне?

Первое приведенное выше совпадение должно начинаться с word1, если word2,word3,etc НЕ является вторым словом.

Я не хочу изменять $m[1] и $m[2], просто для совпадения, когда word2,word2,etc является вторым словом в строке.

Должно совпадать,

word1 something, and more.

но не

word1 word2 something, and more.
word1 word3 something, and more.

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Вы можете использовать: ^(word1\s(?!word2|word3).+)\,\s?(.+)$

Демо

0 голосов
/ 20 октября 2018

Если вы хотите сопоставить строки, которые начинаются с word1, но word2 и word3 не встречаются где-либо еще в строке, то вы можете попробовать использовать отрицательное прогнозное утверждение:

^word1(?!.*\b(?:word2|word3)\b).*$

Демо

Термин (?!.*\b(?:word2|word3)\b) утверждает, что мы не видим word2 или word3 как отдельные слова где-либо еще в оставшейся части строки.

Вот фактический код PHP:

preg_replace_callback('/^(word1(?!.*\b(?:word2|word3)\b).*),(.*)\./i',
    function($m) {
        # processing $m[1] and $m[2]
    }, $str);

Не так много изменений в приведенном выше коде, за исключением того, что я вставил отрицательный прогноз, чтобы убедиться, что word2 и word3не встречаются.

...