[英]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.