C# 替换意外行为

C# 替换意外行为,c#,.net,regex,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); 预期产出: 单词1单词2 55单词3单词4 55单词5 实际: 单词1单词2@aaa | 55单词3单词4@aaa | 55单词5 我相信,这是件愚蠢的事。。。为什么? 这个问题不是关于“特殊人物”。这

代码如下:

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

单词1单词2 55单词3单词4 55单词5

实际:

单词1单词2@aaa | 55单词3单词4@aaa | 55单词5

我相信,这是件愚蠢的事。。。为什么?


这个问题不是关于“特殊人物”。这相当于不理解问题所在。上面的问题没有具体的例子。

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

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

您需要避开|符号,因为它通常充当“或”符号。
同时删除单词边界,因为|不能是单词的一部分。

您的模式不起作用,原因有两个:


  • \b@
    与边界处的空格不匹配。空格字符和
    @
    字符都是非单词字符。它们之间没有单词边界,所以不能使用单词边界来匹配。一种选择是
    (?,尽管上面的答案是有效的。对于新手来说,简单的解决方案是用“/”替换“或”(|)和\并使用“/gi”替换所有。下面是演示


    \b
    匹配单词边界,但
    @
    不是单词字符,因此空格和
    @
    之间的位置不是单词边界。此外,如果要匹配文字管道而不是字符,则应转义
    alternate@CertainPerformance好主意。我需要以某种方式将此
    @
    包含在此se中arch.所以…看起来应该这样:
    @“@aaa\| sss\b”
    太好了!但是如果我真的不关心
    @
    之前的内容。我只关心我有
    @aaa\|…
    ,我只关心
    之后的内容是一个单词。因此,我应该避开
    @@aaa\\124; sss\b”
    ,对吗?例如
    我的text@aaa|xxxxx….
    应该可以then@T.S.是的,没错。谢谢你,先生!很高兴有像你这样的大师。我今天晚些时候会研究这个技巧。很有趣。同时,请投票支持重新打开这个问题。谢谢
    (?<=\s)@aaa\|sss\b
    
    (?:(?<=\s)|\b)@aaa\|sss\b
    
     var str = "Word1 Word2 @aaa|sss Word3 Word4 @aaa|sss Word5";
         str = str .replace( /@aaa\|sss/gi, "55" )