代码如下:
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无关。这不是理解问题所在。而且上面的问题没有这里的具体情况。
答案 0 :(得分:1)
这实际上是正确的行为,因为您可以使用在线正则表达式网站进行测试。
这是您要搜索的正则表达式字符串:“ @ aaa \ | sss”(您可能还需要转义\)。
您需要转义|符号,因为它通常充当“或”符号。 还要删除单词边界,例如|不能是单词的一部分。
答案 1 :(得分:1)
您的模式无效的原因有两个:
\b@
与空格边界不匹配。空格字符和@
字符都是非单词字符。它们之间没有单词边界,因此您不能使用单词边界来匹配它。一种替代方法是(?<=\s)
。如果您仍然想匹配单词边界以及空格边界,则另一个选择是(?:(?<=\s)|\b)
。|
不会转义。这意味着您的正则表达式的意思是“ @aaa” 或“ sss”。考虑到这些因素,您可以像这样修复正则表达式:
(?<=\s)@aaa\|sss\b
或者:
(?:(?<=\s)|\b)@aaa\|sss\b
答案 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" )