为什么我会在同一模式下为类似的搜索字符串获得不同的行为?
请注意,以下内容是由同事而非我自己撰写的。
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)(?!))$
)并未使用上述条件。
答案 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就在这里,我对他的观点比对我自己更感兴趣。