在.NET Regex中需要转义哪些字符?

Eri*_*ric 35 .net regex escaping

在.NET Regex模式中,需要转义哪些特殊字符才能按字面意思使用?

Jon*_*eet 42

我不知道完整的字符集 - 但我不会依赖这些知识,我也不会把它放到代码中.相反,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);
}
Run Code Online (Sandbox Code Playgroud)

  • @JonSkeet:谢谢你指出Regex.Escape,我正要重新发明一个方形轮,直到我看到你的答案. (3认同)
  • @rodrigocl:使用`haystack.IndexOf(needle) >= 0` (2认同)
  • 此外,有趣的是,这不会转义“-”(连字符),这会导致字符类出现问题。我想约定是在字符类中首先放置连字符,所以大多数人不会像我那样遇到问题,最终是这样的字符串:$@"[a-zA-Z0-9{System.Text.RegularExpressions .Regex.Escape("_-$}")}]" 这导致了“以相反顺序解析 "[a-zA-Z0-9_-$]" - [xy] 范围有点混乱。” 参数异常。 (2认同)

Meg*_*wal 25

以下是需要转义以将其用作普通文字的字符列表:

  1. 打开方括号 [
  2. 反斜杠 \
  3. 插入符号 ^
  4. 美元符号 $
  5. 期间或点 .
  6. 垂直条或管道符号 |
  7. 问号 ?
  8. 星号或星号 *
  9. 加号 +
  10. 打开圆形支架(和闭合圆形支架)
  11. 打开花括号 {
  12. 磅/哈希标志 #

这些特殊字符通常称为"元字符".

但是,我同意Jon Regex.Escape在代码中使用而不是硬编码这些字符.

  • 我想你需要在列表中加入`{`. (5认同)

JDB*_*JDB 13

请参阅此处的MSDN文档:http://msdn.microsoft.com/en-us/library/az24scfc.aspx#character_escapes

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


L.B*_*L.B 13

我想你可以把字符列表作为

List<char> chars = Enumerable.Range(0,65535)
                .Where(i=>((char)i).ToString()!=Regex.Escape(((char)i).ToString()))
                .Select(i=>(char)i)
                .ToList();
Run Code Online (Sandbox Code Playgroud)

-

\t\n\f\r#$()*+.?[\^{|
Run Code Online (Sandbox Code Playgroud)