正则表达式替换意外行为

时间:2019-02-28 06:47:09

标签: c# .net regex

代码如下:

    var x = "Word1 Word2 @aaa|sss Word3 Word4 @aaa|sss Word5";
    var s = Regex.Replace(x, "\\b@aaa|sss\\b", "55", RegexOptions.Singleline);

预期输出:

  

Word1 Word2 55 Word3 Word4 55 Word5

实际:

  

Word1 Word2 @aaa | 55 Word3 Word4 @aaa | 55 Word5

我敢肯定,这有点愚蠢……为什么?

此问题与“特殊字符” as in here无关。这不是理解问题所在。而且上面的问题没有这里的具体情况。

3 个答案:

答案 0 :(得分:1)

这实际上是正确的行为,因为您可以使用在线正则表达式网站进行测试。

这是您要搜索的正则表达式字符串:“ @ aaa \ | sss”(您可能还需要转义\)。

您需要转义|符号,因为它通常充当“或”符号。 还要删除单词边界,例如|不能是单词的一部分。

答案 1 :(得分:1)

您的模式无效的原因有两个:

  • \b@与空格边界不匹配。空格字符和@字符都是非单词字符。它们之间没有单词边界,因此您不能使用单词边界来匹配它。一种替代方法是(?<=\s)。如果您仍然想匹配单词边界以及空格边界,则另一个选择是(?:(?<=\s)|\b)
  • |不会转义。这意味着您的正则表达式的意思是“ @aaa” “ sss”。

考虑到这些因素,您可以像这样修复正则表达式:

(?<=\s)@aaa\|sss\b

Demo

或者:

(?:(?<=\s)|\b)@aaa\|sss\b

Demo

答案 2 :(得分:0)

尽管上述答案是有效的。对于新手来说,简单的解决方案是用\代替“ OR”(|)并使用“ / gi”代替All。这里是演示https://regex101.com/r/jdIfsb/1

 var str = "Word1 Word2 @aaa|sss Word3 Word4 @aaa|sss Word5";
     str = str .replace( /@aaa\|sss/gi, "55" )