Regex.Escape的目的是什么?

时间:2011-08-24 15:06:30

标签: c# visual-studio

我有一个如下代码,其中'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) + ")$";

4 个答案:

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