如何在Groovy

时间:2018-02-01 17:30:40

标签: regex groovy

我正在使用Jenkins Pipeline并且为了编写Pipeline脚本,我们必须使用Groovy。 所以,我想解析控制台输出以找到特定单词之前的所有数字 例如有字符串:

  • 838123 someWord
  • 8 someWord
  • 12 someWord

输出应为:838123,或812

我使用正则表达式:.*(\\d+)\\ssomeWord.*但它只返回最新的数字,例如3中的838123

1 个答案:

答案 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] }