Regex模式对几乎相同的输入字符串产生不同的结果

本文关键字:字符串 结果 输入 模式 Regex | 更新日期: 2023-09-27 18:08:26

为什么在相同的模式下对相似的搜索字符串得到不同的行为?

请注意,下面是一个同事写的,不是我自己。

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
------

背景阅读:这里有一个条件正则表达式(?(expression)yes|no)的例子-如果它匹配表达式,它寻找yes模式,否则它不寻找模式。然而,这里我们不提供no案例模式。

下面是一个不使用上面提到的|no条件的正则表达式(搜索:(?(Open)(?!))$)的示例。

Regex模式对几乎相同的输入字符串产生不同的结果

展品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处匹配


它的行为就好像,没有|,它匹配"yes"的第一个字符为"yes"。

用这个,我们得到Not match/Not match:

    string pattern = @"(?(.*'d)agarbage|bgarbage)";
    MatchTest("xy xya", pattern);
    MatchTest("xy xyb", pattern);

用这个,我们得到Match 'b' at index 5:

    string pattern = @"(?(.*'d)a|b)";
    MatchTest("xy xya", pattern);
    MatchTest("xy xyb", pattern);

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