环视无法通过.net提供预期的结果

时间:2010-10-19 14:32:20

标签: .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 个答案:

答案 0 :(得分:2)

我认为你的想法有点混乱。当你说,在模式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 <{>>之前来自{{ 1}}到a',后面的 似乎是明显的答案:

k

应该匹配这样的(?<=[a-k])o (但我自己没有运行过)。

答案 1 :(得分:1)

问题是,(?=匹配当前输入但不向前移动。所以(?= [az])匹配“o”,而不是向前移动,然后你匹配“o” ”

你想看看背后吗? “(?&lt; = k)o”会为你工作吗?