Aplicando NÃO restrição a um padrão regex

votos
0

Eu uso preg_replace_callbackcom o padrão de

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

para combinar um início sentença com word1. Como posso modificar o padrão para fazer uma restrição para a segunda palavra no padrão?

O primeiro jogo acima deve começar com word1contanto que word2,word3,etcnão são a segunda palavra.

Eu não quero alterar $m[1]e $m[2], só para corresponder quando word2,word2,etcsão a segunda palavra na cadeia.

Ele deve corresponder,

word1 something, and more.

mas não

word1 word2 something, and more.
word1 word3 something, and more.
Publicado 20/10/2018 em 13:42
fonte usuário
Em outras línguas...                            


2 respostas

votos
2

Se você deseja corresponder linhas que começam com word1, mas word2e word3não ocorrem em nenhum outro lugar na linha, então você pode tentar usar uma afirmação lookahead negativo:

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

programa demonstrativo

O (?!.*\b(?:word2|word3)\b)termo afirma que não vemos word2ou word3como palavras independentes em qualquer outro lugar no restante da linha.

Aqui está o código PHP real:

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

Não há muito realmente muda no código acima, exceto que eu inserido um lookahead negativo para se certificar de que word2e word3não ocorrem.

Respondeu 20/10/2018 em 13:51
fonte usuário

votos
1

Você pode usar: ^(word1\s(?!word2|word3).+)\,\s?(.+)$

programa demonstrativo

Respondeu 20/10/2018 em 13:59
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more