2017-04-03 56 views
1

我試圖創建一個正則表達式用或者正則表達式用或者不匹配第一個表達式

我有這個

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

的目標是獲取一切的背後a,或者當a不目前,一切從一開始。

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

它總是匹配or的第二部分,因爲它捕捉到組(數據2) 誰能告訴我,爲什麼出現這種情況

+0

什麼是''和''? –

+0

爲什麼你有兩個不同的組名(data1和data2)?不需要兩個不同的名字。組名字符應該像使用'匹配。您有< and >。 – jdweng

+0

@jdweng所以我可以跟蹤哪些部分被執行 –

回答

2

從默認從左到右的字符串被解析,當第一替代失敗的正則表達式引擎嘗試第二個。第二個替代方案與第一個替代方案匹配相同的文本,因此當字符串包含b後的一個或多個字符不是b時,第二個替代方案將始終獲勝。

var pattern = "a[^b]+b|^[^b]+b"; 
var result = Regex.Match("123412a123b", pattern, RegexOptions.RightToLeft); 
if (result.Success) 
    Console.WriteLine(result.Value); 

C# demo

0

如何:

您可以通過將RegexOptions.RightToLeft選項,使它看起來在相反方向的匹配覆蓋.NET默認的正則表達式引擎的行爲?

(?<data>a?[^ab]+b) 
+0

Thanx這是最簡單的方式小我沒有想到這個 –

0

你可以試試下面 - 易於理解。

var reg = @"(.*)([a].*)"; 
string data = "123412x123b"; 
var gps = Regex.Match(data, reg).Groups; 

string result = gps.Count > 1 ? gps[2].Value : data;