多个正则表达式模式匹配单个字符串groovy

时间:2018-03-30 17:08:30

标签: java regex groovy

我有一个像这样的测试字符串

08:28:57,990 DEBUG [http-0.0.0.0-18080-33] [tester] [1522412937602-580613] [TestManager] ABCD: loaded 35 test accounts

我想要正则表达式并匹配" ABCD"和" 35"在这个字符串

   def regexString = ~ /(\s\d{1,5}[^\d\]\-\:\,\.])|([A-Z]{4}\:)/
   ............
   while (matcher.find()) {
                acct = matcher.group(1)
                grpName = matcher.group(2)
                println ("group : " +grpName + " acct : "+ acct)
            }

我的当前输出是

group : ABCD: acct : null
group : null acct :  35 

但我期待这样的事情

group : ABCD: acct : 35

在循环进入while()之前,是否有任何选项可以匹配字符串中的所有模式。或者更好的方法来实现这个

2 个答案:

答案 0 :(得分:0)

我相信你的问题与正则表达式中的'或'有关。我认为它实际上是解析它两次,一次匹配正则表达式的前半部分,然后再次匹配“|”之后的后半部分。你需要一个在一个解析中匹配的正则表达式。您可以撤消匹配,以便按顺序匹配:

/([A-Z]{4})\:.*\s(\d{1,5)}[^\d\]-"\,\.]/

另请注意括号中的更改,因此您捕获的内容超出了您的需要 - 目前您正在捕获组名后的':'和acct之前的额外空格。这假设“ABCD”将始终位于“35”之前。

假设你的所有字符串的格式非常相似,你还可以做更多的事情:

例如,如果在acct编号后面总是有空格,则可以将其简化为:

/([A-Z]{4})\:.*\s(\d{1,5)}\s/

你可能还有很多工作要做,以确保你总能捕捉到正确的东西,但我必须要看到或了解更多有关数据集的信息。

当然,您可以在代码中切换匹配顺序:

  while (matcher.find()) {
                grpName = matcher.group(1)
                acct = matcher.group(2)
                println ("group : " +grpName + " acct : "+ acct)
            }

答案 1 :(得分:0)

您可以使用

str

请参阅Groovy demo

正则表达式 - String s = "08:28:57,990 DEBUG [http-0.0.0.0-18080-33] [tester] [1522412937602-580613] [TestManager] ABCD: loaded 35 test accounts" def res = s =~ /\b([A-Z]{4}):[^\]\[\d]*(\d{1,5})\b/ if (res.find()) { println "${res[0][1]}, ${res[0][2]}" } else { println "not found" } - 匹配一个字符串,该字符串以包含4个大写ASCII字母(捕获到组1)的整个单词开头,然后跟\b([A-Z]{4}):[^\]\[\d]*(\d{1,5})\b和除{{1之外的0 +字符},:和数字,然后匹配并捕获包含1到4位数的整数。

请参阅regex demo

在代码中,[运算符使正则表达式引擎找到部分匹配(即在字符串内的任何位置搜索模式),]变量包含保存整个匹配的所有匹配对象在=~内,res内的第1组和res[0][0]中的第2组值。