我有一个像这样的测试字符串
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()之前,是否有任何选项可以匹配字符串中的所有模式。或者更好的方法来实现这个
答案 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组值。