【发布时间】:2015-02-16 14:43:25
【问题描述】:
我想简单解释一下 C# 中正则表达式的转义结构。我已经阅读了 MSDN 页面,但似乎我无法编写有效的 Regex.Escape()
此外,转义“(”,“)”和“。”的工作示例人物会很棒。例如somestring = Regex.Escape("("+"(.*?))");
谢谢
【问题讨论】:
我想简单解释一下 C# 中正则表达式的转义结构。我已经阅读了 MSDN 页面,但似乎我无法编写有效的 Regex.Escape()
此外,转义“(”,“)”和“。”的工作示例人物会很棒。例如somestring = Regex.Escape("("+"(.*?))");
谢谢
【问题讨论】:
如documentation中所述:
转义一组最小字符(,\, *, +, ?, |, {, [, (,), #, ^, $, ., 和空格)通过用它们的转义码替换它们。这指示正则表达式引擎解释这些字符 字面意思而不是元字符。
这基本上意味着,在正则表达式语言中,您有一些特殊字符。这些字符包括?、*、.、+等运算符。
例如,有一个正则表达式威胁,+ 作为字符 +,而不是 一个或多个先前的操作符,我们像这样转义它:\+ .这告诉解析引擎按原样处理+。
转义方法的作用是为这些字符添加额外的反斜杠。
因此,鉴于此:Regex.Escape("("+"(.*?))");,输出字符串将为\(\(\.\*\?\)\),这意味着匹配给定字符串:(.*?))。
【讨论】:
Regex.Escape(@"()\.") will yield: \(\)\\\.. (` 和 \) 因为你分别转义 ( 和 )。然后你得到 \\ 因为你需要转义 ` and finally, you get \.` 因为你需要逃离.。
在您尝试使用该变量的值作为正则表达式来搜索特定子字符串的变量中,可能存在一些正则表达式元字符的可能性。在这种情况下,我们需要将变量放在Regex.Escape 函数中,以使变量中存在的特殊字符自动转义。
【讨论】:
Regex.Escape("("+"(.*?))")
基本上输入中的任何元字符前面都有一个反斜杠。所以:
\(\(\.\*\?\)\)
当然,任何显示字符串就好像它在 C# 源代码中的内容(如 VS 调试器工具窗口)本身会转义反斜杠,因此显示如下:
\\(\\(\\.\\*\\?\\)\\)
(因此为什么 verbastin 字符串对正则表达式如此有用。)
PS。不要自己写Regex.Escape:你只会错过一些语法的边缘情况(而且有很多)。框架方法是可以使用的,所以使用它。
【讨论】: