OK,
Si vous voulez correspond pas à un personnage que vous le mettez dans une classe de caractères (les crochets) et commencer avec le caractère^qui nie, par exemple [^a]
signifie tout caractère mais un minuscule ' une'.
Donc, si vous ne voulez pas arobase, suivi par chaîne, suivi d'un autre pas arobase, vous voulez
[^@]string[^@]
Maintenant, le problème est que les classes de caractères verseront chacun un personnage, de sorte Dans votre exemple, nous aurions "chaîne" qui comprend les espaces de début et de fin. Donc, il y a une autre construction qui vous dit de ne rien faire correspondre, et c'est parens avec un?: Au début. (?:)
. Donc vous entourez les extrémités avec ça.
(?:[^@])string(?:[^@])
OK, mais maintenant il ne correspond pas au début de la chaîne (qui prête à confusion, est le caractère ^
faire double devoir en dehors d'une classe de caractères) ou à la fin de la chaîne $
. Nous devons donc utiliser le caractère OU |
pour dire "donnez-moi un début de chaîne non signé" et à la fin "donnez-moi un OU fin de chaîne" comme ceci:
(?:[^@]|^)string(?:[^@]|$)
EDIT: L'anticipation négative vers l'avant et vers l'arrière est une solution plus simple (et intelligente), mais pas disponible pour tous les moteurs d'expressions régulières.
Maintenant, une question de suivi. Si vous aviez le mot "astringent", voulez-vous toujours faire correspondre la "chaîne" à l'intérieur? En d'autres termes, "string" doit-il être un mot par lui-même? (Malgré ma réaction initiale, cela peut devenir assez compliqué :))
@Mark Thomas: Vous devez être nouveau ici;) – webbiedave
@Mark Thomas: ce n'est pas si basique, d'autant plus qu'au début regex peut être assez difficile à grok –
Certes, ce n'est pas si basique, je suppose, mais ce serait quelque chose qui est documenté. Et l'OP n'a même pas essayé lui-même. Quelque chose qui le rendrait plus compliqué est s'il avait besoin de capturer seulement aux frontières de mot, par ex. s'il voulait ignorer la "chaîne" dans "astringent" –