2 回答

TA贡献1895条经验 获得超3个赞
您的基本设置是正确的,但您的模式与理想模式有些偏差。尝试使用以下正则表达式模式:
(?<=\[OK:)[^\]]+|(?<=itId=<)[^>]+
这仍然使用一个观察,但它只断言前面的是 。然后,它甚至在不使用捕获组的情况下,匹配任何数量的字符,这些字符不是右方括号。这对应于您尝试查找的内容。交替项右侧的部分与值匹配。[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贡献1858条经验 获得超8个赞
如果你想捕获 中的数字,然后以该顺序捕获后面的内容,你可以利用锚点来断言上一场比赛结束时的位置。itId=<1232>
OK:
\G
匹配第一个捕获组中的数字和第二个捕获组中的值:itId
OK:
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 位以上数字|
或\G(?!^)
上一场比赛结束,而不是在开始时\[OK:([A-Z0-9]+)\]\s*
Match ,然后在组 2 中捕获您的值并进行匹配,后跟 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));
}
}
添加回答
举报