我试图使用Or
创建正则表达式我有这个
(?<data1>a[^b]+b)|(?<data2>^[^b]+b)
目标是捕获a
后面的所有内容,或者当a
不存在时,从一开始就捕获所有内容。
data = "123412123b" result should be "123412123b"
data = "123412a123b" result should be "a123b"
它始终匹配or
的第二部分,因为它捕获到组(data2)
任何人都可以告诉我为什么会发生这种情况
答案 0 :(得分:2)
默认情况下,字符串从左到右进行解析,当第一个选项失败时,正则表达式引擎会尝试第二个。第二个备选方案与第一个备选方案匹配相同的文本,因此当字符串在b
以外的一个或多个字符后包含b
时,第二个备选方案将始终获胜。
您可以通过传递RegexOptions.RightToLeft
选项来覆盖.NET中的默认正则表达式引擎行为,以使其在相反的方向上查找匹配项:
var pattern = "a[^b]+b|^[^b]+b";
var result = Regex.Match("123412a123b", pattern, RegexOptions.RightToLeft);
if (result.Success)
Console.WriteLine(result.Value);
请参阅C# demo
答案 1 :(得分:0)
这个怎么样?
(?<data>a?[^ab]+b)
答案 2 :(得分:0)
你可以尝试以下 - 易于理解。
var reg = @"(.*)([a].*)";
string data = "123412x123b";
var gps = Regex.Match(data, reg).Groups;
string result = gps.Count > 1 ? gps[2].Value : data;