繁体   English   中英

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

[英]multiple regex pattern matches in a single string 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()之前,是否有任何选项可以匹配字符串中的所有模式。 或者更好的方法来实现这一点

我相信您的问题与正则表达式中的“或”有关。 我认为它实际上是对其进行了两次解析,一次是匹配正则表达式的前半部分,然后是再次匹配“ |”后的后半部分。 您需要一个正则表达式,在一个解析中将两者都匹配。 您可以反转匹配项,以便它们按顺序匹配:

/([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)
            }

您可以使用

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"
}

参见Groovy演示

正则表达式- \\b([AZ]{4}):[^\\]\\[\\d]*(\\d{1,5})\\b匹配以一个包含4个大写ASCII字母的单词开头的字符串(捕获到组1中),然后加上:和0+个除[]和数字之外的字符,然后匹配并捕获由1到4位数字组成的整数到组2中。

参见regex演示

在代码中, =~运算符使regex引擎找到部分匹配项(即,在字符串内的任意位置搜索模式),并且res变量包含在res[0][0]内包含所有匹配项的所有匹配对象1个内部res[0][1]和在第2组值res[0][2]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM