我正在使用Jenkins Pipeline并且为了编写Pipeline脚本,我们必须使用Groovy。 所以,我想解析控制台输出以找到特定单词之前的所有数字 例如有字符串:
输出应为:838123
,或8
或12
。
我使用正则表达式:.*(\\d+)\\ssomeWord.*
但它只返回最新的数字,例如3
中的838123
。
答案 0 :(得分:3)
当您使用正则表达式时(请参阅its demo),第一个.*
,由于*
(0次或更多次出现)量词而成为一个贪婪的子模式,匹配的字符数与它可以(除了换行符之外的任何0 +字符)然后回溯试图为后续子模式提供一些文本。 (\d+)
在3
中找到838123
,因为它符合 1或更多位的要求,所以每天调用一次,然后匹配空格和{{1} } - >找到了匹配。
作为一种选择,您可以在这里使用延迟量词,someWord
,但有更好的方法。
您可以在两端使用不带.*?(\\d+)\\ssomeWord.*
的正则表达式,但要确保将其与.*
一起使用,而不是=~
运算符(后者需要完整的字符串匹配):
==~
请参阅Groovy demo。
结果:
def s="838123 someWord\n8 someWord\n12 someWord"
def rx = /(\d+)\s*someWord/
def res = s =~ rx
(0..<res.count).each { println res[it][1] }