Si je comprends bien les commentaires, ce que vous voulez est de capturer tous les mots qui ne sont pas Foo
ou Bar
, puis probablement les imprimer en quelque sorte. Ce serait une façon de faire une telle chose:
/(?<!\S)(?!Foo|Bar)\S+(?!\S)/g
Il est moins compliqué qu'il n'y paraît, voici la version annotée:
/
(?<!\S) # match cannot be preceded by non-whitespace
(?!Foo|Bar)(\S+) # capture non-whitespace that is not Foo|Bar
(?!\S) # match cannot be followed by non-whitespace
/gx # match globally and ignore whitespace in regex
Notez que /x
est juste là, je peux utiliser les commentaires et nouvelles lignes à l'intérieur de l'expression régulière.
Les pièces de début et de fin de cette regex sont nos ancres de délimitation. Nous les utilisons pour nous assurer que nous n'obtenons pas de correspondances partielles. Ce sont des assertions de coup d'œil négatives, et des remplacements pour l'assertion de limite de mots \b
un peu plus simple. Cependant, il n'était pas possible d'utiliser ici \b
, car vous avez un caractère virgule dans votre chaîne. La raison pour laquelle nous utilisons (?!\S)
au lieu de \s
est que, bien qu'ils correspondent tous deux aux espaces, ce dernier ne correspond pas au début/à la fin de la chaîne. Puisque nous nous sommes assurés que nous ne pouvons pas obtenir de correspondances partielles, nous pouvons maintenant utiliser une simple alternance dans nos ancres avec une autre assertion de lookahead négative. C'est à dire. (?!Foo|Bar)
. Si cela ne correspond pas, nous capturons la chaîne avec (\S+)
.
est ici le cas de test j'ai créé pour ce problème:
perl -nlwe 'push @a, [/(?<!\S)(?!Foo|Bar)(\S+)(?!\S)/g] }{ print "@$_" for @a'
The Foo bar, and Bar foo needs to Foo
The Bar of Bar foo Bar Foo Foo
Bar bar The Bar of Foo other Foo Bar
^Z
The bar, and foo needs to
The of foo
bar The of other
Il utilise notre regex pour capturer des chaînes de $_
(l'entrée) et les pousser sur le tableau @a
dans les références du tableau. Une fois l'entrée terminée (après l'opérateur esquimau }{
), nous imprimons les références de tableau interpolées pour ajouter des espaces. "@$_"
est équivalent à join " ", @$_
dans ce cas.
+1 Je crois maintenant que c'est ce qu'il demandait – ChicagoRedSox
@ChicagoRedSox Vous étiez celui qui a réussi à l'amener à le dire, donc +1 à vous pour cela. – TLP