C#Regex为什么在下面的例子中需要2 \\?

时间:2016-11-11 13:14:43

标签: c#

这是来自MS的一个例子。我不明白为什么在先生\。?在C#中有两个转义字符,在一个正则表达式测试器中,只需要写一个Mr. ?,所以它必须是C#特定的。

public static void Main()
{
   string pattern = "(Mr\\.? |Mrs\\.? |Miss |Ms\\.? )";
   string[] names = { "Mr. Henry Hunt", "Ms. Sara Samuels", 
                      "Abraham Adams", "Ms. Nicole Norris" };
   foreach (string name in names)
      Console.WriteLine(Regex.Replace(name, pattern, String.Empty));
} 

3 个答案:

答案 0 :(得分:2)

这里有两件事。在c#中,字符串中存在某些需要转义序列的字符:

https://msdn.microsoft.com/en-us/library/aa691090(v=vs.71).aspx

  

在常规字符串 - 文字字符中跟随反斜杠字符()的字符必须是以下字符之一:',“,\,0,a,b,f,n,r,t,u ,U,x,v。否则,发生编译时错误。

所以第一个反斜杠就是让字符串有效 - 它与Regex没有任何关系。

第二件事是,句号意味着“匹配任何字符”在正则表达式中匹配实际句号它必须使用单个斜杠进行转义。

单斜杠只需要第二个斜杠,只是为了使字符串文字有效。

答案 1 :(得分:0)

您需要\来逃避.字符,并且您必须使用2 \,以便第一个\也被转义。

Mr.   - means match Mr[anything] 
Mr\.  - means match Mr\[anything]
Mr\\. - means match Mr.

我希望这是可以理解的。

答案 2 :(得分:0)

我通过在C#中查找常规字符串的属性(如选择逐字字符串)找到了解决方案。在一个字符串内#34; " a \只能与某些字符组合使用,例如,可以使用\ t oder \ n,但是。不被允许。所以要得到输出(先生必须写#34;(先生\。,以便第一个\逃脱第二个。