2013-12-10 2 views
12

Есть ли способ избежать специальных символов в регулярном выражении, например []()* и других, из строки?Escape Special Character в Regex

В принципе, я прошу пользователя ввести строку, и я хочу, чтобы иметь возможность искать в базе данных с помощью регулярного выражения. Некоторые из проблем, с которыми я столкнулся, это too many)'s или [x-y] range in reverse order и т. Д.

Так что я хочу написать функцию для замены на пользовательском входе. Например, замена ( с \(, заменив [ с \[

Есть встроенная функция для регулярных выражений, чтобы сделать это? И если мне нужно написать функцию с нуля, можно ли легко учесть все символы вместо того, чтобы писать оператор replace один за другим?

Я пишу свою программу в C# с использованием Visual Studio 2010

+0

Поиск Google на * C# избежать специальный символ регулярных выражений * возвращает ответ. –

+0

Можно утверждать, что пользователь должен ввести правильный RE в первую очередь. Вы не можете просто избежать случайного символа, если вы не знаете, является ли это особым персонажем или нет. (Если вы не хотите, чтобы пользователь вводил RE конечно, но тогда questin - это то, почему вы бы использовали RE для запроса). – eckes

ответ

21

Вы можете использовать .NET встроен в Regex.Escape для этого. Скопировано из примера от 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?] 
0
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); 
+1

Не могли бы вы дать некоторое объяснение вашему коду? – adao7000

+0

Это много ненужной работы для создания неверного результата. –