2 回答
TA貢獻(xiàn)1895條經(jīng)驗 獲得超3個贊
您的基本設(shè)置是正確的,但您的模式與理想模式有些偏差。嘗試使用以下正則表達(dá)式模式:
(?<=\[OK:)[^\]]+|(?<=itId=<)[^>]+
這仍然使用一個觀察,但它只斷言前面的是 。然后,它甚至在不使用捕獲組的情況下,匹配任何數(shù)量的字符,這些字符不是右方括號。這對應(yīng)于您嘗試查找的內(nèi)容。交替項右側(cè)的部分與值匹配。[OK:itId
String ok_pattern = "(?<=\\[OK:)[^\\]]+|(?<=itId=<)[^>]+";
Pattern p_ok = Pattern.compile(ok_pattern);
String testString = "RANDOMTEXT itId=<1232> Code < [OK:AZ1000105] [OK:10000006] [OK:F1000000007] > RANDOMTEXT";
Matcher m = p_ok.matcher(testString);
while (m.find()) {
System.out.println(m.group(0));
}
1232
AZ1000105
10000006
F1000000007
TA貢獻(xiàn)1858條經(jīng)驗 獲得超8個贊
如果你想捕獲 中的數(shù)字,然后以該順序捕獲后面的內(nèi)容,你可以利用錨點(diǎn)來斷言上一場比賽結(jié)束時的位置。itId=<1232>OK:\G
匹配第一個捕獲組中的數(shù)字和第二個捕獲組中的值:itIdOK:
itId=<(\d+)> Code < |\G(?!^)\[OK:([A-Z0-9]+)\]\s*
在爪哇:
String ok_pattern = "itId=<(\\d+)> Code < |\\G(?!^)\\[OK:([A-Z0-9]+)\\]\\s*";
解釋
itId=<(\d+)> Code <匹配第一部分并在組 1 中捕獲 1 位以上數(shù)字|或\G(?!^)上一場比賽結(jié)束,而不是在開始時\[OK:([A-Z0-9]+)\]\s*Match ,然后在組 2 中捕獲您的值并進(jìn)行匹配,后跟 0 個以上的空格字符[OK:]
請注意,如果要匹配更多,也可以使用否定字符類來匹配而不是方括號([A-Z0-9]+)([^]]+)
例如,您可以檢查組是否存在:
String ok_pattern = "itId=<(\\d+)> Code < |\\G(?!^)\\[OK:([^]]+)\\]\\s*";
Pattern p_ok = Pattern.compile(ok_pattern);
String testString = "RANDOMTEXT itId=<1232> Code < [OK:AZ1000105] [OK:10000006] [OK:F1000000007] > RANDOMTEXT";
Matcher m = p_ok.matcher(testString);
while(m.find()) {
if (null != m.group(1)) {
System.out.println("itId: " + m.group(1));
}
if (null != m.group(2)) {
System.out.println("Ok code: " + m.group(2));
}
}
添加回答
舉報
