为什么备选的顺序在正则表达式中很重要?

时间:2013-08-02 13:07:26

标签: c# .net regex

代码

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”的顺序发生变化时,为什么替换不起作用?如何解决这个问题?

1 个答案:

答案 0 :(得分:6)

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

换句话说,因为foofoobar的一部分,(foo|foobar)无法与foobar匹配,因为它始终与foo匹配第一

实际上,偶尔,这可能是一个非常有用的技巧。模式(o|a|(\w))将允许您以不同方式捕获\wao

Regex.Replace("a foobar& b", "(o|a|(\\w))", "$2") // fbr& b