我的字符串" 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,更多东西}
答案 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
将遍历所有匹配。