.net - Look around 未通过 .net 提供预期结果

标签 .net regex replace

我想使用前瞻正则表达式来替换 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

这意味着“当我们处于下一个字符是从 ak 的位置时,匹配 o”。不出所料,这永远不会匹配 - 如果我们处于下一个字符ak的地方,它也不是 将成为o!

模式 3 更加明显

(?=k)o

表示“当我们到达下一个字符是 k 的位置时,匹配 o”。同样,没有匹配项。

pattern1 匹配的原因是因为 o 位于 a-z 中,因此只要下一个字符是 o ,它也满足“在 az 中的某物”的标准,因此匹配。

我也不确定为什么您希望 # 不替换 2 和 3 中的 o。如果 5 正在执行您想要的操作,那么您肯定会这样做可以直接用吗?我无法轻易了解如何使用前瞻来执行 5 正在执行的操作 - 执行“匹配(仅)一个前面某物的o”操作从ak',向后看似乎是显而易见的答案:

(?<=[a-k])o

应该匹配这样的o(但我自己没有运行过这个)。

关于.net - Look around 未通过 .net 提供预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3969437/

相关文章:

.net - 非 COM、非 .NET DLL 的正确名称?

python - 用破折号替换任何非 A-Z、非数字的最佳 Python 方式

javascript - 使用字母、括号和数字修改字符串

Javascript::如何将关联数组的键获取到数组变量?

java - java中使用正则表达式获取数据

ruby-on-rails - 如何从数组构建正则表达式?

c - 在不使用字符串库函数的情况下替换 C 中的子字符串

c# - Lucene - 对子句计数的评分效果

c# - 如何添加对 IRunnableTask 的引用

c# - Mono 上的 SignalR 和 Websockets