web-dev-qa-db-fra.com

Escape Special Character dans Regex

Existe-t-il un moyen d'échapper aux caractères spéciaux dans une expression rationnelle, tels que []()* et autres, d'une chaîne?

Fondamentalement, je demande à l'utilisateur de saisir une chaîne et je veux pouvoir effectuer une recherche dans la base de données à l'aide de regex. Certains des problèmes que j'ai rencontrés sont too many)'s ou [x-y] range in reverse order, etc.

Donc, ce que je veux faire est d’écrire une fonction à remplacer par la saisie de l’utilisateur. Par exemple, remplacer ( par \(, remplacer [ par \[

Existe-t-il une fonction intégrée permettant à regex de le faire? Et si je dois écrire une fonction à partir de rien, existe-t-il un moyen de comptabiliser facilement tous les caractères au lieu d'écrire l'instruction de remplacement un par un?

J'écris mon programme en C # avec Visual Studio 2010

17
sora0419

Vous pouvez utiliser .NET intégré dans Regex.Escape pour cela. Copié à partir de l'exemple de Microsoft:

string pattern = Regex.Escape("[") + "(.*?)]"; 
string input = "The animal [what kind?] was visible [by whom?] from the window.";

MatchCollection matches = Regex.Matches(input, pattern);
int commentNumber = 0;
Console.WriteLine("{0} produces the following matches:", pattern);
foreach (Match match in matches)
   Console.WriteLine("   {0}: {1}", ++commentNumber, match.Value);  

// This example displays the following output: 
//       \[(.*?)] produces the following matches: 
//          1: [what kind?] 
//          2: [by whom?]
27
brandonscript

vous pouvez utiliser Regex.Escape pour l'entrée de l'utilisateur

9
L.B
string matches = "[]()*";
StringBuilder sMatches = new StringBuilder();
StringBuilder regexPattern = new StringBuilder();
for(int i=0; i<matches.Length; i++)
    sMatches.Append(Regex.Escape(matches[i].ToString()));
regexPattern.AppendFormat("[{0}]+", sMatches.ToString());

Regex regex = new Regex(regexPattern.ToString());
foreach(var m in regex.Matches("ADBSDFS[]()*asdfad"))
    Console.WriteLine("Found: " + m.Value);
0
A Solution