正则表达式模式在几乎相同的输入字符串上产生不同的结果

时间:2016-09-22 19:12:50

标签: c# regex

为什么我会在同一模式下为类似的搜索字符串获得不同的行为?

请注意,以下内容是由同事而非我自己撰写的。

https://dotnetfiddle.net/veyasw

using System;
using System.Text.RegularExpressions;

public class Program
{

    static void MatchTest(string input, string pattern)
    {
        Console.WriteLine("pattern: " + pattern);
        Console.WriteLine("input: " + input + Environment.NewLine);
        Match match = Regex.Match(input, pattern);

        if (match.Success)
            Console.WriteLine("Match '{0}' at index {1}", match.Value, match.Index);
        else
            Console.WriteLine("Not match");

        Console.WriteLine("\r\n------\r\n");

    }

    static void DiffBehaviousTest() // (?(expression)yes) has different behavious. Sometime it matches with string empty.
    {
        /* if last character in word is digit
                match ab
        */
        string pattern = @"(?(.*\d\b)ab)";

        MatchTest("xy xya", pattern);
        MatchTest("xy xyz", pattern);
    }


    public static void Main()
    {
        DiffBehaviousTest();
    }
}

产生:

pattern: (?(.*\d\b)ab)
input: xy xya

Match '' at index 5

------

pattern: (?(.*\d\b)ab)
input: xy xyz

Not match

------

背景阅读: 这是a conditional regex (?(expression)yes|no)的示例 - 如果它与表达式匹配,则会查找yes模式,否则它将查找无模式。但是,我们不提供no案例模式。

此处an example of a regex {搜索:(?(Open)(?!))$)并未使用上述条件。

1 个答案:

答案 0 :(得分:2)

图表A:

    string pattern = @"(?(.*\d\b)agarbage)";

    MatchTest("xy xya", pattern);
    MatchTest("xy xyb", pattern);
  

模式:(?(。* \ d \ b)agarbage)      输入:xy xya

     

在索引5处匹配''

           

模式:(?(。* \ d \ b)agarbage)      输入:xy xyb

     

不匹配

     

图表B:

    string pattern = @"(?(.*\d\b)bgarbage)";

    MatchTest("xy xya", pattern);
    MatchTest("xy xyb", pattern);
  

模式:(?(。* \ d \ b)bgarbage)      输入:xy xya

     

不匹配

           

模式:(?(。* \ d \ b)bgarbage)      输入:xy xyb

     

在索引5处匹配''

     

它表现得好像没有|,它与“是”的第一个字符匹配为“是”。

有了这个,我们得到不匹配/不匹配:

    string pattern = @"(?(.*\d)agarbage|bgarbage)";

    MatchTest("xy xya", pattern);
    MatchTest("xy xyb", pattern);

有了这个,我们在索引5获得匹配'b':

    string pattern = @"(?(.*\d)a|b)";

    MatchTest("xy xya", pattern);
    MatchTest("xy xyb", pattern);

我(犹豫地)认为在无管道情况下解析器中可能存在错误。但是@EricLippert就在这里,我对他的观点比对我自己更感兴趣。