RegEx与OR不匹配第一个表达式

时间:2017-04-03 10:12:06

标签: c# regex

我试图使用Or

创建正则表达式

我有这个

(?<data1>a[^b]+b)|(?<data2>^[^b]+b)

目标是捕获a后面的所有内容,或者当a不存在时,从一开始就捕获所有内容。

data = "123412123b" result should be "123412123b"  
data = "123412a123b" result should be "a123b"

它始终匹配or的第二部分,因为它捕获到组(data2) 任何人都可以告诉我为什么会发生这种情况

3 个答案:

答案 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;