我想使用前瞻正则表达式来替换 System.Text.RegularExpression.Replace(...)
方法。
现在我想知道出了什么问题。看一下这个示例代码:
string input = "stackoverflow";
string replacement = "#";
var pattern1 = "(?=[a-z])o";
var result1 = Regex.Replace(input, pattern1, replacement);
// result1 = stack#verfl#w (as expected)
var pattern2 = "(?=[a-k])o";
var result2 = Regex.Replace(input, pattern2, replacement);
// result2 = stackoverflow (expected: stack#overflow)
var pattern3 = "(?=k)o";
var result3 = Regex.Replace(input, pattern3, replacement);
// result3 = stackoverflow (expected: stack#overflow)
var pattern4 = "[a-k]";
var result4 = Regex.Replace(input, pattern4, replacement);
// result4 = st###ov#r#low (as expected)
var pattern5 = "([a-k])o";
var result5 = Regex.Replace(input, pattern5, "$1#");
// result5 = stack#verflow" (as expected)
这很奇怪。
我可以在前瞻表达式中使用 [a-z]
,但不能使用 [a-k]
甚至 k
。
我真正想要的是最后一个例子(pattern5)的结果。这是一个解决方法,但我很好奇为什么pattern2或pattern3没有返回预期的结果。结果。
最佳答案
我认为你的前瞻想法有点困惑。当你说,在模式 2 中,
(?=[a-k])o
这意味着“当我们处于下一个字符是从 a
到 k
的位置时,匹配 o
”。不出所料,这永远不会匹配 - 如果我们处于下一个字符是从a
到k
的地方,它也不是 将成为o
!
模式 3 更加明显
(?=k)o
表示“当我们到达下一个字符是 k
的位置时,匹配 o
”。同样,没有匹配项。
pattern1 匹配的原因是因为 o
位于 a-z
中,因此只要下一个字符是 o
,它也满足“在 a
到 z
中的某物”的标准,因此匹配。
我也不确定为什么您希望 #
不替换 2 和 3 中的 o
。如果 5 正在执行您想要的操作,那么您肯定会这样做可以直接用吗?我无法轻易了解如何使用前瞻来执行 5 正在执行的操作 - 执行“匹配(仅)一个前面某物的o
”操作从a
到k
',向后看似乎是显而易见的答案:
(?<=[a-k])o
应该匹配这样的o
(但我自己没有运行过这个)。
关于.net - Look around 未通过 .net 提供预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3969437/