2017-04-12 30 views
2

我有以下行字符串「winline」可能會出現一次或多次(或沒有),我不知道它會出現在行中多少次。正則表達式捕獲多個事件,並將它們放在組中

有沒有一種方法可以捕捉到本文中出現的所有'winline'?我正在使用Groovy並嘗試匹配winline,並且它捕獲所有內容,但每個都被聲明爲組1.我希望能夠逐組地捕獲它們。

實施例使用下面的上行此正則表達式:winline \ 「:([0-9] +)

def matcher 
def winningSym = /winline\":([0-9]+)/ 

if((matcher = line =~ winningSym)){ 
    println matcher[0][1] // get 5 which is right 
    println matcher[1][1] // expect 4 but get IndexOutOfBounds Exception 
} 

線:

{」 ID 「:1,」 winline 「5,」 贏「:50000,一些隨機的文字, 」winline「:4, 更隨機的文字, 」winline「:7,更多的東西}

+0

這是真的**你必須解析的文本嗎?有人看到了JSON格式,並決定編寫自己的不可解析的變體? –

+0

@tim_yates是的,不幸的是它是需要被解析的文本。 – cubeb

回答

1

您可以稍微修改重新GEX使用積極的回顧後,用一個簡單的代碼:

def winningSym = /(?<=winline":)[0-9]+/ 
String s = """{"Id":1,"winline":5,"Winnings":50000, some random text, "winline":4, more random text, "winline":7, more stuff}""" 
def res = s.findAll(winningSym) 
println(res) 

Groovy demo,輸出:[5, 4, 7]

要使用您正則表達式和收集組1倍的值的匹配使用.collect(如匹配器支持iterator()法):

​​3210

another Groovy demo。這裏,it[1]將訪問捕獲組1中的內容,並且.collect將遍歷所有匹配。