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