簡體   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