我有一个如下代码,其中'QualifiedInstanceFilter'是限定实例过滤器的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) + ")$";
答案 0 :(得分:4)
Regex.Escape
用于“转义”一个字符串,该字符串可能包含在正则表达式中具有特殊含义的字符。例如(一个简单的例子):
假设我想根据用户输入搜索字符串。有人会认为我可以编写像".*" + UserInput + ".*"
这样的正则表达式。如果用户搜索“$ money”,问题就出现了? $
在正则表达式中具有特殊含义,因此导致此正则表达式:.*$money.
- 这是不正确的。
如果我们在此之前使用Regex.Escape
,那么$
字符将被转义以避免此行为。
您可以从documentation了解更多信息。
答案 1 :(得分:2)
来自MSDN,
转义一组最小字符
(\, *, +, ?, |, {, [, (,), ^, $,.
,#
和白色空间)用它们的转义码替换它们。这个 指示正则表达式引擎解释这些字符 字面上而不是元字符。
在您的代码中,它设置的连接字符串等于m_afc.QualifiedInstanceFilter
和“转义”this.Identifier
中的任何内容。如果有任何特殊字符,则会预先设置\
并将其视为非元字符。
答案 2 :(得分:1)
组成Identifier
的字符串是任意字符串 - 可以想象包括[
]
*
\
等字符以及其他所有字符在正则表达式中具有特殊含义的字符。但是,QualifiedInstanceFilter
的期望效果是与Identifier
字面匹配,所以如果我们只是说
m_afc.QualifiedInstanceFilter = "^(" + this.Identifier + ")$";
我们可能会以^(()$(${P${}$*${$}{$)$
之类的值结束,这会极大地混淆正则表达式引擎。因此我们使用Regex.Escape
来说:“我想在正则表达式中使用此字符串,但我希望通常对正则表达式特殊的字符具有其特殊含义”。然后正则表达式引擎将转义特殊字符(通过前置\
),这样当我们通过连接创建常规epxression时,其中唯一的正则特殊字符是我们放在那里的那些 - 初始{{1最后^(
。
答案 3 :(得分:1)
比其他答案更简单:
如果你想匹配Regex中特殊字符的字符,你会怎么做,例如一段时间 ”。”?你在它前面放了一个反斜杠,即你逃避它。
Regex.Escape
为您传递的任何字符串执行此操作,因此它可以在编译时转义您不知道的内容。一个例子是在正则表达式中包含用户指定的字符串,它可能包含特殊字符。