2010-03-30 5 views
6

J'ai read que pour correspondre à un mot à l'intérieur d'une chaîne en utilisant des expressions régulières (en. NET), je peux utiliser le spécificateur de limite de mot (\b) dans la regex. Cependant, aucun de ces appels n'aboutit à des correspondancesregex très simple ne fonctionne pas

Regex.Match("INSERT INTO TEST(Col1,Col2) VALUES(@p1,@p2)", @"\[email protected]\b"); 

Regex.Match("INSERT INTO TEST(Col1,Col2) VALUES(@p1,@p2)", @"\bINSERT\b"); 

Y at-il quelque chose que je fais de mal?

EDIT: Le second travaille déjà;)

Répondre

9

Mise à jour: Comme another answer a souligné, @ n'est pas un caractère de mot donc il n'y a pas de limite de mot entre @ et de l'espace. Pour contourner ce problème, vous pouvez utiliser à la place un negative lookbehind:

@"(?<!\w)@p1\b" 

réponse originale: Vous avez besoin d'un @ devant vos expressions régulières:

@"\[email protected]\b" 

Sans cela, la chaîne " \ b "est interprété comme un retour arrière (caractère 8), pas une limite de mot d'expression régulière. Il y a plus d'informations sur @-quoted string littéraux sur MSDN.

Une autre façon sans utiliser @ littéraux de chaîne entre guillemets est d'échapper à vos antislashs:

"\\[email protected]\\b" 
1

Le \ est de s'échapper dans vos cordes - vous devez utiliser string literals pour éviter ceci:

@"\bINSERT\b" 

Sinon, l'expression régulière voit "bINSERTb".

+0

Juste eu ce problème, tout fonctionnait dans mes différents testeurs externes RegEx; juste pas dans mon code - j'ai oublié le @. – ProVega

4

Le deuxième cas est résolu par @"\bINSERT\b" comme indiqué dans une autre réponse.

Cependant /b matchs à:

  • Avant le premier caractère de la chaîne , si le premier caractère est un caractère de mot .
  • Après le dernier caractère de la chaîne , si le dernier caractère est un caractère de mot .
  • Entre deux caractères de la chaîne, où l'un est un caractère de mot et l'autre autre n'est pas un caractère de mot.

Un caractère de mot est l'un des [a-zA-Z0-9_] de sorte que le premier cas est non résolvable préfixer @ pour échapper au caractère \b parce que vous essayez de faire correspondre alors un caractère non mot (@).


Mise à jour: Le premier cas peut être résolu par une affirmation négative regarder en arrière, mais aussi en utilisant une limite de mot niée \B qui se traduit par une syntaxe plus propre (@"\[email protected]\b").

+0

Oh, merci de l'avoir signalé;) Y a-t-il un moyen de le surmonter? –

+0

@Thomas Wanner, vous pouvez utiliser des expressions régulières Lookbehind Zero-Width Assertions. Cochez Mark Byers pour trouver une solution. –

Questions connexes