Regex模式对几乎相同的输入字符串产生不同的结果
本文关键字:字符串 结果 输入 模式 Regex | 更新日期: 2023-09-27 18:08:26
为什么在相同的模式下对相似的搜索字符串得到不同的行为?
请注意,下面是一个同事写的,不是我自己。
https://dotnetfiddle.net/veyaswusing 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)(?!))$
)的示例。
展品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在这里,我对他的观点比对我自己的更感兴趣。