在.NET正则表达式中,哪些字符需要进行转义?

42
在 .NET 的 Regex 模式中,哪些特殊字符需要转义才能被当作字面量使用?
4个回答

51

我不知道完整的字符集 - 但无论如何我都不会依赖这些知识,并且我也不会将其编写到代码中。相反,当我需要一些我不确定的文字时,我会使用Regex.Escape

// Don't actually do this to check containment... it's just a little example.
public bool RegexContains(string haystack, string needle)
{
    Regex regex = new Regex("^.*" + Regex.Escape(needle) + ".*$");
    return regex.IsMatch(haystack);
}

4
@JonSkeet:谢谢您指出Regex.Escape,否则我差点要重复发明轮子了,直到看到您的回答。 - mcdon
1
@JonSkeet:我知道现在很晚了,但为什么不采用包含方式呢?因为我必须使用.NET 1.1,所以无法使用String.Contains和等价方法。 - rodrigocl
2
@rodrigocl:使用 haystack.IndexOf(needle) >= 0 - Jacob Krall
2
有趣的是,这个程序并没有转义“-”(连字符),这会在字符类中引起问题。我猜想惯例是将连字符放在字符类的第一位,所以大多数人不会像我一样遇到以下字符串的问题: $@"[a-zA-Z0-9{System.Text.RegularExpressions.Regex.Escape("-$}")}]" 这导致了一个有些令人困惑的“解析“[a-zA-Z0-9-$]” - [x-y] 范围顺序颠倒”的 ArgumentException。 - csrowell
1
我同意不将这些知识放入代码中。然而,我发现自己有时会编写正则表达式作为.NET工具的输入,并且知道哪些字符需要转义在这种情况下非常有帮助。 - Jonathan van de Veen
显示剩余10条评论

30

以下是需要转义以将它们用作普通字面量的字符列表:

  1. 开方括号[
  2. 反斜杠\
  3. 脱字符^
  4. 美元符号$
  5. 点或圆点.
  6. 竖杠或管道符号|
  7. 问号?
  8. 星号*
  9. 加号+
  10. 左圆括号(和右圆括号)
  11. 左花括号{
  12. 井号#

这些特殊字符通常称为“元字符”。

但是,我同意Jon的观点,应该在代码中使用 Regex.Escape 代替硬编码这些字符。


6
我认为你需要在列表中包含 { 符号。 - H2ONaCl
1
and include " - Arman Spr
1
正如JDB所说,这取决于上下文。例如,]不在列表中,但如果作为文字使用并在[之前,则需要转义。 - Tawab Wakil
1
如果我尝试转义星号或星号*,就会出现错误,但如果我不转义它,似乎可以正常工作。 - Jon
1
为什么需要转义八角井号(“#”)符号?这似乎是上面列表中的一个错误。 - knockNrod
@knockNrod 可以使用 # 在正则表达式中添加注释,详情请参见Microsoft官网。此外,Regex.Escape也会认为应该进行转义 - 对我来说这已足够。 - Hans Kesting

14

请查看MSDN文档:http://msdn.microsoft.com/en-us/library/az24scfc.aspx#character_escapes

完整列表的问题在于它取决于上下文。例如,.必须进行转义,除非它被括号包围,例如[.]]从技术上讲不需要进行转义,除非它前面有[-没有特殊意义,除非它在括号内,如[A-Z]=没有特殊含义,除非它前面有?,如(?=)


14
我认为您可以按以下方式获取字符列表:
List<char> chars = Enumerable.Range(0,65535)
                .Where(i=>((char)i).ToString()!=Regex.Escape(((char)i).ToString()))
                .Select(i=>(char)i)
                .ToList();

--

\t\n\f\r#$()*+.?[\^{|

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接