2017-06-15 66 views
1

我有如下多行,其中'ProgressiveAwardWinnings'部分可能存在也可能不存在。我試圖從這些行中提取數字數據。捕獲可能存在或可能不存在的值

LineStake 「:5000.0,」 獲得 「:200,-something- ProgressiveAwardWinnings」:10000 LineStake 「:5000.0,」 獲得「:100, -something-

因此所提取的信息從第一行將是5000.0,200,10000和第二行將是5000.0,200,空

我的正則表達式如下:第三個值顯示爲兩行的空值我期待第三個值被捕獲請注意。

正則表達式

LineStake\":([0-9\.]+),\"Won\":([0-9\.]+),.*?(?:ProgressiveAwardWinnings\"\:([0-9]+))? 
+1

@AxelH時,'(:)'是一個非捕獲組,結腸不是?文字。第一個'?'屬於'*'量詞,使其不貪婪。 –

+0

@MalteHartwig不知道那個,謝謝。 – AxelH

回答

2

的問題是,.*?比賽0+字符作爲越好,跳過第一次正則表達式引擎過來對這一模式的一部分,並嘗試匹配其餘的模式。如果他們匹配,.*?甚至沒有嘗試過,不是擴展。非捕獲組是可選的,它可以匹配空字符串。

因此,一旦200上線1匹配,.*?被跳過,(?:...)?一個空的空間200後匹配,並且匹配在該點返回。

解決的辦法是把.*?到可選的組:

LineStake\":([0-9\.]+),\"Won\":([0-9\.]+),(?:.*?ProgressiveAwardWinnings\"\:([0-9]+))? 
              ^^^ 

參見regex demo

+0

忘了補充:在'(?:...)?中增加'。*?'是可行的,因爲'?'是一個* greedy *量詞,因此正則表達式引擎會嘗試至少匹配它的模式。 –

相關問題