代码之家  ›  专栏  ›  技术社区  ›  Jürgen Steinblock

环顾四周并不能用.NET提供预期的结果

  •  2
  • Jürgen Steinblock  · 技术社区  · 14 年前

    我想用look ahead regex替换 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 . 我真正想要的是最后一个例子(模式5)的结果。这是一个令人担忧的问题,但我很好奇,为什么模式2或模式3不能返回预期值。结果。

    2 回复  |  直到 14 年前
        1
  •  2
  •   AakashM    14 年前

    我认为你的想法是向前看有点混乱。当你在模式2中说,

    (?=[a-k])o
    

    这意味着“当我们在一个地方,下一个角色是来自 a k 匹配 o “。不出所料,这永远不会匹配-如果我们在一个地方,在下一个角色 来自某物 K 不是这样 将成为一个 o !

    模式3更加鲜明

    (?=k)o
    

    意思是“当我们在下一个角色所在的地方 K 匹配 o “。同样,没有匹配项。

    原因模式1 匹配是因为 o 是在 a-z ,所以每当下一个字符是 o 它也符合“某物在”的标准。 z ,所以是匹配的。

    我也不知道你为什么期望 # 不替换 o ,在2和3。如果5是做你想做的,那么你肯定可以用它吗?我不太明白如何用“展望”来做5号正在做的事情——进行“匹配”(只是)一个 o 那就是 先于 从某个地方 K “看, 后面 显而易见的答案是:

    (?<=[a-k])o
    

    应该和这样一个 o (但我自己还没有运行)。

        2
  •  1
  •   Damien_The_Unbeliever    14 年前

    问题是,(?=与当前输入匹配,但不向前移动。那么?=[A-Z])匹配“O”,而不是前进,然后您匹配“O”。

    你想看后面吗?会”(?)<=k)o“为你工作?