2009-10-23 8 views
0

dans mon programme C#, j'ai une expression régulière textparser, qui trouve toutes les occurrences de mots qui sont entourés par des crochets doubles. Par exemple, [[n'importe quoi]] trouverait le mot n'importe quoi. Dans un deuxième temps, je veux compter combien de fois le mot trouvé (dans mon exemple: n'importe quoi) apparaît dans le texte entier. Pour ce faire, j'essaie de créer un RE qui contient le mot trouvé et compte, combien de matches je reçois. Le problème est que le mot trouvé peut également contenir des caractères spéciaux et l'expression rationnelle suivante:Trouver un littéral avec une expression régulière

string foundWord = "(anything"; 
Regex countOccurences = new Regex(foundWord); 

va évidemment échouer lorsque la variable contient des caractères spéciaux comme « (» Expresso suggère pour ensemble des expressions correspondant à la construction suivante:.

Regex countOccurences = new Regex("(?(" + foundWord + ")Yes|No)"); 

mais quand dans ce scénario foundWord est un nombre, comme « 2009 », le RE essaie de l'interpréter comme une référence à un groupe (qui est évidemment pas défini). dans mon texte, il peut y avoir une combinaison des caractères normaux, des caractères spéciaux, des chiffres, etc.

Comment puis-je dire au RE d'interpréter la chaîne donnée comme une expression littérale uniquement?

Merci à l'avance, Frank

Répondre

6

Vous devez échapper au littéral avant de construire l'expression régulière avec, en utilisant Regex.Escape

Quelque chose comme:

Regex countOccurances = new Regex(Regex.Escape(foundWord)); 

Cependant, comme tout ce que vous êtes faire est de compter les occurrences, une meilleure option est d'éviter d'utiliser une expression régulière pour la deuxième recherche du tout. Puisque vous ne vous souciez pas des caractères spéciaux, il serait plus facile de faire une recherche en texte brut.

+0

Eh bien, parfois c'est tellement facile. Merci de me l'avoir signalé! – Aaginor

1

Si vous essayez simplement de compter le nombre d'occurences d'une chaîne, pourquoi utiliser une regex? Utilisez simplement vos bibliothèques de chaînes de base, contains(), indexOf(), tout ce qui a le plus de sens en C#. Mais si vous n'avez pas besoin de la fonctionnalité fantaisie d'une regex, pourquoi utiliser une regex? Je pense que

int position = string.indexOf(foundString); 
while(position != -1) 
{ 
    count++; 
    position = string.indexOf(foundString, position + 1); 
} 

accomplirait sans regexes.

+0

Merci pour ce tipp! Cela fonctionne bien, quand changé à position = string.indexOf (foundString, position + 1); - Sinon, vous obtiendrez une boucle sans fin. – Aaginor

+0

bonne prise, édité pour réparer –

Questions connexes