我的参赛作品:
String e1 = "MyString=1234 MyString=5678";
String e2 = "MyString=1234\nMyString=5678";
我在做什么:
String pattern = "MyString=(.*)";
Pattern patternObj = Pattern.compile(pattern);
Matcher matcher = patternObj.matcher(e1); //e1 or e2
if (matcher.find()) {
System.out.println("G1: " + matcher.group(1));
System.out.println("G2: " + matcher.group(2));
}
我想要的输出:
G1: 1234
G2: 5678
答案 0 :(得分:2)
只有一个组会多次匹配。你必须保持匹配和打印组1:
int i = 0;
while (matcher.find()) {
System.out.println("G" + (++i) + ": " + matcher.group(1));
}
此外,您需要更新模式,使其与下一个MyString
不匹配。您可以使用\d+
或\w+
或[^\s]+
,具体取决于您匹配的值的类型。
答案 1 :(得分:1)
如果它始终是数字,您可以将其用作正则表达式:
String pattern = "MyString=([0-9]*)";
如果它包含字母和数字,Wiktor Stribizew的评论在原帖中非常有用。他说使用\ w匹配单词字符。
答案 2 :(得分:1)
最简单的“快速修复”是用.
(字母,数字或下划线)替换\w
(任何字符,但换行符):
String pattern = "MyString=(\\w*)"; // <---- HERE
Pattern patternObj = Pattern.compile(pattern);
Matcher matcher = patternObj.matcher(e1);
if (matcher.find()) {
System.out.println("G1: " + matcher.group(1));
System.out.println("G2: " + matcher.group(2));
}
现在,MyString=(\\w*)
匹配MyString=
子字符串,并在不匹配任何空格,标点符号和其他非字符串后匹配并捕获任何0个或多个字母,数字或下划线-word chars。
注意:如果您需要匹配任何字符但空格,则可以使用\S
代替\w
。