在正则表达式中转义特殊字符

Posted

技术标签:

【中文标题】在正则表达式中转义特殊字符【英文标题】:Escape Special Character in Regex 【发布时间】:2013-12-28 15:29:29 【问题描述】:

有没有办法从字符串中转义正则表达式中的特殊字符,例如[]()* 等?

基本上,我要求用户输入一个字符串,并且我希望能够使用正则表达式在数据库中进行搜索。我遇到的一些问题是too many)'s[x-y] range in reverse order 等。

所以我想做的是编写一个函数来替换用户输入。例如,将(替换为\(,将[替换为\[

正则表达式有内置函数吗?如果我必须从头开始编写一个函数,有没有一种方法可以轻松地计算所有字符,而不是一个一个地编写替换语句?

我正在使用 Visual Studio 2010 用 C# 编写程序

【问题讨论】:

Google 搜索 C# 转义特殊字符正则表达式会返回答案。 可以说用户必须首先输入正确的 RE。如果您不知道它是否是特殊字符,则不能只转义随机字符。 (除非您当然不希望用户输入 RE,但问题是您为什么要使用 RE 进行查询)。 【参考方案1】:

您可以为此使用 .NET 内置的 Regex.Escape。复制自微软的例子:

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?]

【讨论】:

【参考方案2】:

你可以使用Regex.Escape作为用户的输入

【讨论】:

【参考方案3】:
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);

【讨论】:

这是很多不必要的工作来创建不正确的结果。

以上是关于在正则表达式中转义特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

需要在正则表达式中转义的所有特殊字符的列表

你如何在 Freemarker 中转义正则表达式字符串

应该在正则表达式中转义哪些文字字符?

在正则表达式中转义(\')单引号,它在两个单引号之间采用字符串。

我必须在 Perl 预编译的正则表达式中转义哪些字符?

Java - 在正则表达式中转义元字符 [ 和 ] [重复]