2008-12-28 8 views
2

Je vais essayer de développer une regex qui sera utilisé dans un programme C# ..Difficulté avec Simple Regex (préfixe correspondance/suffixe)

Ma première regex était:

(?<=\()\w+(?=\)) 

qui correspond avec succès "(foo)" - assortir mais exclure de la sortie les parens ouverts et fermés, pour produire simplement "foo".

Cependant, si je modifie l'expression rationnelle:

\[(?<=\()\w+(?=\))\] 

et je tenter de faire correspondre "[(foo)]" il ne correspond pas. C'est surprenant. Je ne fais que préfixer et ajouter l'accolade littérale autour de mon expression précédente. Je suis perplexe. J'utilise Expresso pour développer et tester mes expressions.

Merci d'avance pour votre aide.

Rob Cecil

Répondre

3

hors contexte, il est difficile de juger, mais le regard-behind ici est probablement excessif Ils sont utiles pour exclure les chaînes (comme dans l'exemple de Strager) et. dans d'autres circonstances particulières où les RE simples échouent, mais je de dix les voient utilisées où des expressions plus simples sont plus faciles à écrire, fonctionnent dans plus de saveurs RE et sont probablement plus rapides.
Dans votre cas, vous pouvez probablement écrire (\b\w+\b) par exemple, ou même (\w+) en utilisant des limites naturelles, ou si vous voulez distinguer (foo) de -foo- (par exemple), en utilisant \((\w+)\).
Maintenant, peut-être que le contexte dicte cette utilisation alambiquée (ou peut-être que vous étiez en train d'expérimenter avec look-behind), mais il est bon de savoir des alternatives. Maintenant, si vous êtes simplement curieux, pourquoi la deuxième expression ne fonctionne pas: ce sont les "assertions de largeur nulle": elles vérifient que ce qui suit ou qui précède est conforme à ce qui est attendu, mais elles ne sont pas '' t consomme la chaîne donc tout ce qui suit (ou avant si négatif) doit également correspondre à l'assertion. Par exemple. Si vous mettez quelque chose après l'anticipation positive qui ne correspond pas à ce qui est affirmé, vous êtes sûr que l'ER échouera.

6

Votre look-behinds sont le problème. Voici comment la chaîne est en cours de traitement:

  1. Nous voyons [dans la chaîne, et il correspond à la regex.
  2. Look-derrière en regex nous demande de voir si le caractère précédent était «(. Cela échoue, parce qu'il était un« [.

Au moins thats ce que je suppose est la cause du problème .

Essayez cette regex à la place:

(?<=\[\()\w+(?=\)\]) 
+0

Mes pensées exactement. – configurator