【问题标题】:Regex.Replace unexpected behavior [duplicate]正则表达式。替换意外行为[重复]
【发布时间】:2019-02-28 06:47:09
【问题描述】:

代码如下:

    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

实际:

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

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

这个问题不是关于“特殊字符”as in here。这倒是不明白问题出在哪里。而且上面的问题没有这里的具体情况。

【问题讨论】:

  • \b 匹配单词边界,但@ 不是单词字符,所以空格和@ 之间的位置不是单词边界。另外,如果你想匹配一个文字管道而不是替代,你应该转义|
  • @CertainPerformance 不错。我需要以某种方式将此@ 包含在此搜索中。所以...看起来应该这样做:@"@aaa\|sss\b"

标签: c# .net regex


【解决方案1】:

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

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

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

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

Demo

或者:

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

Demo

【讨论】:

  • 太棒了!但如果我真的不在乎@ 之前的内容。我只关心我有@aaa\|... 并且我只关心| 之后的任何内容都是一个单词。因此,我应该摆脱@"@aaa\|sss\b",对吗?比如my text@aaa|xxxxx&lt;htmlTag&gt;. . . . 应该没问题
  • @T.S.是的,没错。
  • 谢谢先生!很高兴有像你这样的大师
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    虽然上述答案有效。对于新手来说,简单的解决方案是用 \ 转义 "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" )
    

    【讨论】:

    • 我将在今天晚些时候介绍这项技术。有趣的。同时,请投票支持重新提出这个问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    相关资源
    最近更新 更多