正则表达式捕获多次出现并将它们分组

时间:2017-04-12 21:18:02

标签: regex groovy

我的字符串" 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," Winnings":50000,一些随机文字," winline": 4,   更多随机文字," winline":7,更多东西}

1 个答案:

答案 0 :(得分:1)

您可以稍微修改正则表达式以使用正面的lookbehind并使用更简单的代码:

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() 方法):

def winningSym = /winline":([0-9]+)/
String line = """{"Id":1,"winline":5,"Winnings":50000, some random text, "winline":4, more random text, "winline":7, more stuff}"""
def res = (line =~ winningSym).collect { it[1] }

another Groovy demo。在这里,it[1]将访问捕获组1内的内容,.collect将遍历所有匹配。