Pergunta

Eu estou querendo combinar uma lista de palavras que é bastante fácil quando essas palavras são realmente palavras. Por exemplo /\b (pop|push) \b/gsx quando concorreu contra a cadeia

pop deu a porta um empurrão, mas ele bateu para trás

irá coincidir com as palavras pop e empurrar, mas não apareceu.

Eu preciso funcionalidade semelhante para palavras que contêm caracteres que normalmente qualificam como limites de palavra. Então eu preciso /\b (reverse!|push) \b/gsx quando concorreu contra a cadeia

empurrar reverso! reverter! impulso

para corresponder apenas reverso! e empurrar, mas não coincidir com empurrão! inversa. Obviamente este regex não vai fazer isso, então o que eu preciso para usar em vez de \ b para fazer o meu bastante inteligente regex para lidar com esses requisitos funk?

Foi útil?

Solução

No final de uma palavra, \ b significa "o personagem anterior era um caractere de palavra, e o próximo caractere (se houver uma próxima personagem) não é um caractere de palavra. Você quer deixar cair a primeira condição porque pode ser um caractere não-palavra no final da "palavra" que te deixa com um lookahead negativo:.

/\b (reverse!|push) (?!\w)/gx

Eu tenho certeza regexes AS3 apoiar lookahead.

Outras dicas

O primeiro problema é que você precisa de três (possivelmente quatro) casos em sua alternância, não dois.

  • /\breverse!(?:\s|$)/ reverter! por si só
  • empurrão /\bpush\b/ por si só
  • /\breverse!push\b/ juntos
  • /\bpushreverse!(?:\s|$)/ este é o caso possível

O segundo problema é que a \b não irá corresponder após um "!" porque não é um \w. Aqui está o que Perl 5 tem a dizer sobre \b , você pode querer consultar os seus documentos para ver se eles concordam:

Um limite de palavra ( "\ b") é um local entre dois caracteres que tem um "\ w" de um lado do mesmo e um "\ W" sobre o outro lado do mesmo (por qualquer ordem), contando o caracteres imaginários fora o início e fim da cadeia como combinando uma "\ W". (Nas classes de caracteres "\ b" representa retrocesso em vez de um limite de palavra, assim como faz normalmente em qualquer seqüência entre aspas.)

Assim, a regex que você precisa é algo como

/ \b ( reverse!push | reverse! | push ) (?: \s | \b | $ )+ /gx;

Eu deixei de fora a /s porque não há períodos neste regex, então tratar como uma única linha não faz sentido. Se /s faz tratamento não médio como uma única linha no seu motor provavelmente você deve adicioná-lo de volta. Além disso, você deve ler sobre como o seu motor lida com alternância. Eu sei que em Perl 5 para obter o comportamento correto você deve organizar os itens dessa maneira (de outra forma inversa! Sempre conquistar reverso! Push).

Você pode substituir \ b por algo equivalente, mas menos rigoroso:

/(?<=\s|^)(reverse!|push)(?=\s|$)/g

Desta forma, o fator limitante do \b (que só pode corresponder antes ou depois de um caractere real palavra \w) é removido.

espaço Agora branco ou o início / fim da função de cadeia como separadores válidos, e a expressão interna pode ser facilmente construída em tempo de execução, a partir de uma lista de termos de pesquisa, por exemplo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top