5

代码

using System;
using System.Text.RegularExpressions;

namespace RegexNoMatch {
    class Program {
        static void Main () {
            string input = "a foobar& b";
            string regex1 = "(foobar|foo)&?";
            string regex2 = "(foo|foobar)&?";
            string replace = "$1";
            Console.WriteLine(Regex.Replace(input, regex1, replace));
            Console.WriteLine(Regex.Replace(input, regex2, replace));
            Console.ReadKey();
        }
    }
}

预期产出

a foobar b
a foobar b

实际输出

a foobar b
a foobar& b

问题

当正则表达式模式中“foo”和“foobar”的顺序发生变化时,为什么替换不起作用?如何解决这个问题?

4

1 回答 1

7

正则表达式引擎尝试按照指定的顺序匹配备选方案。因此,当模式立即(foo|foobar)&?匹配foo并继续尝试查找匹配项时。输入字符串的下一位是bar& b无法匹配的。

换句话说,因为foo是 的一部分foobar,所以(foo|foobar)永远不会匹配foobar,因为它总是foo首先匹配。

实际上,有时这可能是一个非常有用的技巧。该模式(o|a|(\w))将允许您捕获\wa/或o不同:

Regex.Replace("a foobar& b", "(o|a|(\\w))", "$2") // fbr& b
于 2013-08-02T13:12:14.010 回答