Regex.Escape的目的是什么?

4
我有如下代码,其中'QualifiedInstanceFilter'是限定实例过滤器的访问器。请问有谁能告诉我在m_afc.QualifiedInstanceFilter = "^(" + Regex.Escape(this.Identifier) + ")$"这一行中发生了什么逻辑。 以下为完整代码:
 public override string Identifier
      {
         get
         {
 return string.Format("{0}{1}{2}{3}{4}",
                 Owner.Class,
                 IDSeparator,
                 ManagedClass.Name, IDClassNameSeparator, Instance);

private AlertFilter m_afc = new AlertFilter("", "", true, "", "", "");

    m_afc.QualifiedInstanceFilter = "^(" + Regex.Escape(this.Identifier) + ")$";

1
你有没有试着看看MSDN? - leppie
4个回答

4
Regex.Escape 是用于“转义”可能包含正则表达式特殊含义字符的字符串的方法。例如(一个简单的例子):
假设我想基于用户输入搜索一个字符串。我们可能会认为可以编写一个正则表达式,如 ".*" + UserInput + ".*"。这个问题在于,如果用户搜索"$money",那么在正则表达式中,$ 具有特殊含义,因此会产生错误的正则表达式:.*$money.
如果我们在此之前使用了 Regex.Escape,那么 $ 字符将被转义以避免出现这种行为。
您可以从文档了解更多信息。

2
MSDN中,

通过替换它们的转义码来转义最小字符集合(\, *, +, ?, |, {, [, (,), ^, $,.,#和空格),这指示正则表达式引擎将这些字符按字面意义解释而不是作为元字符。

在您的代码中,它将一个连接的字符串设置为m_afc.QualifiedInstanceFilter并“转义”this.Identifier中的任何内容。如果有任何特殊字符,则在其前面加上\并将其视为非元字符。

在您的列表中,应删除前导括号。 - undefined

1
组成“标识符”的字符串是任意的字符串 - 它们可能包括一些特殊字符,如[ ] * \ 以及所有在正则表达式中具有特殊含义的其他字符。然而,“QualifiedInstanceFilter”的期望效果是字面匹配“标识符”,因此如果我们只是说
m_afc.QualifiedInstanceFilter = "^(" + this.Identifier + ")$";

我们可能会得到像^(()$(${P${}$*${$}{$)$这样的值,这会让正则表达式引擎非常困惑。因此,我们使用Regex.Escape来表示:“我想在正则表达式中使用这个字符串,但是我希望通常特殊的正则表达式字符不具有它们的特殊含义”。正则表达式引擎将转义特殊字符(通过添加\),以便当我们通过连接创建一个正则表达式时,其中唯一的正则表达式特殊字符是我们放置在那里的字符-初始的^(和最终的)$


1

简单来说:

如果你想匹配一个在正则表达式中是特殊字符的字符,比如句号“.”,该怎么办?你需要在它前面加上反斜杠,也就是对它进行转义

Regex.Escape 可以为你传入的任何字符串进行转义,因此它可以转义编译时你不知道的内容。一个例子是在正则表达式中包含用户指定的字符串,这些字符串可能包含特殊字符。


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