2010-09-04 7 views
3

J'essaye d'analyser une expression et d'exclure des mots communs. Par exemple, dans l'expression «comme le monde tourne», je veux exclure les mots communs «as» et «the» et renvoyer uniquement «world» et «turns».Négation Regex - analyse de mots

(\ w + (?! le | as))

ne fonctionne pas. Commentaires appréciés.

+0

Pourriez-vous être un peu plus précis sur ce qui ne fonctionne pas? Est-ce qu'il ne correspond pas à certains mots que vous voulez qu'il corresponde? Est-ce que cela correspond à des mots qui devraient échouer? Pouvez-vous donner quelques exemples montrant où cela échoue, et expliquer ce que vous vouliez plutôt? –

Répondre

2

Le préanalyse devrait venir en premier:

 
(\b(?!(the|as)\b)\w+\b) 

J'ai également ajouté des limites de mots pour vous assurer qu'il correspond uniquement à des mots entiers sinon il ne parviendrait pas à correspondre au mot complet « comme » mais il égalerait avec succès la lettre "s" de ce mot.

Vous pouvez également considérer ce que les \w correspondent et si cela répond à vos besoins. Si vous cherchez des mots en anglais, vous êtes probablement intéressé par les lettres mais pas les chiffres et vous pouvez inclure des caractères de ponctuation qui sont exclus par \w, tels que les apostrophes. Vous pouvez essayer quelque chose comme ça à la place (Rubular):

/(\b(?!(?:the|as)\b)[a-z'-]+\b)/i 

Pour correspondre des mots plus précisément dans un langage humain, vous pouvez envisager d'utiliser une bibliothèque d'analyse syntaxique de langage naturel au lieu d'expressions régulières.

1

Vous devez utiliser des limites de mots pour ne faire correspondre que des mots entiers. Que ce soit avec une affirmation d'anticipation:

(\b(?!(?:the|as)\b)\w+\b) 

Ou avec un regard-behind affirmation:

(\b\w+\b(?<!\b(?:the|as)))