Regex.Escape的目的是什么?

我有一个像下面的代码,其中’QualifiedInstanceFilter’是限定实例filter的Accessor。 谁能告诉我行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) + ")$"; 

Regex.Escape用于“转义”一个字符串,该字符串可能包含在正则表达式中具有特殊含义的字符。 例如(一个简单的例子):

假设我想根据用户输入搜索字符串。 有人会认为我可以写一个像".*" + UserInput + ".*"这样的正则表达式。 如果用户搜索“$ money”,问题就出现了? $在Regex中具有特殊意义,因此产生了这个正则表达式: .*$money. – 这是不正确的。

如果我们之前使用了Regex.Escape ,那么$ character将被转义以避免这种行为。

您可以从文档中了解有关它的更多信息。

来自MSDN ,

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

在你的代码中,它设置一个连接字符串,等于m_afc.QualifiedInstanceFilter和“转义” this.Identifier任何this.Identifier 。 如果有任何特殊字符,则它们预先加上\并被视为非元字符。

共同构成Identifier的字符串是任意字符串 – 它们可以包含诸如[ ] * \类的字符以及在正则表达式中具有特殊含义的所有其他字符。 但是, QualifiedInstanceFilter的预期效果是字面上匹配 Identifier ,所以如果我们只是说

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

我们最终得到一个像^(()$(${P${}$*${$}{$)$ ,这会极大地混淆正则表达式引擎。所以我们使用Regex.Escape来说:“我想在正则表达式中使用这个字符串,但是我想要通常对regex特殊的字符不具有它们的特殊含义“。然后正则表达式引擎将转义特殊字符(通过添加\ ),这样当我们创建一个通过连接定期表达,其中唯一的正则表达式特殊字符是我们放在那里的那些 – 最初的^(和最终的)$

比其他答案简单一点:

如果你想匹配正则表达式中特殊字符的字符,例如句点“。”,你会怎么做? 你在它前面放了一个反斜杠,即你逃脱它。

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