web-dev-qa-db-fra.com

Faire correspondre la liste des mots sans la liste des caractères autour

J'ai ce regex

(?:$|^| )(one|common|Word|or|another)(?:$|^| )

qui correspond bien à moins que les deux mots ne soient côte à côte.

One one's more Word'word common Word or another Word more another 

More and more years to match one or more other strings

And common Word things and or

Dans ce qui précède, il correspond à one à la ligne deux mais pas au or juste à côté. Idem pour common et Word dans la troisième ligne.

Exemple en direct: http://regex101.com/r/hV3wQ

Je pense que cela a quelque chose à voir avec le nombre de groupes qui ne correspondent pas. Mais, je ne sais pas comment atteindre l'objectif final de faire correspondre toute la liste de mots sans aucun caractère autour d'eux.

Je ne veux pas le one dans one's ou le mot dans Word'word à mettre en correspondance.

19
San

Étant donné que vos groupes de capture définissent explicitement un caractère de chaque côté du mot commun, il recherche spaceWordspace puis lorsqu'il ne trouve pas d'autre space, il échoue.

Dans ce cas, comme vous ne voulez pas faire correspondre tous les caractères que les limites de Word attraperaient (point, apostrophe, etc.), vous devez utiliser un peu de ruse avec des têtes de recherche, des lookbehinds et des groupes non capturés. Essaye ça:

(?:^|(?<= ))(one|common|Word|or|another)(?:(?= )|$)

http://regex101.com/r/cM9hD8

Les limites des mots sont toujours plus simples à implémenter, donc pour référence, vous pouvez également le faire (même si cela inclut ', ., etc.).

\b(one|common|Word|or|another)\b
33
brandonscript

Vous pouvez utiliser (?:[\s]|^)(one|common|Word|or|another)(?=[\s]|$) au lieu.

Il ne correspondra pas à one's, someone, etc ...

Cochez DÉMO

2
Sujith PS