如果我想找到两个匹配项,那么Java正则表达式应该是什么样子
1. NEW D City
2. 1259669
来自
Object No: NEW D City | Item ID: 1259669
我试过
(?<=:\s)\w+
但它只能
1. NEW
2. 1259669
答案 0 :(得分:1)
您可以使用两个分组的组合:
String key = "Object No: NEW D City | Item ID: 1259669";
String[] parts = key.split("\\s*\\|\\s*");
List<String> result = new ArrayList<>();
for (String part : parts) {
String[] kvp = part.split(":\\s*");
if (kvp.length == 2) {
result.add(kvp[1]);
System.out.println(kvp[1]); // demo
}
}
请参阅Java demo
首先,您使用\\s*\\|\\s*
(一个用{0}空格包围的|
分割,然后用:\\s*
分割,冒号后跟0 +空格。
另一种方法是使用:\s*([^|]+)
pattern并抓取并修剪第1组值:
String s = "Object No: NEW D City | Item ID: 1259669";
List<String> result = new ArrayList<>();
Pattern p = Pattern.compile(":\\s*([^|]+)");
Matcher m = p.matcher(s);
while(m.find()) {
result.add(m.group(1).trim());
System.out.println(m.group(1).trim()); // For demo
}
请参阅Java demo。在此正则表达式中,([^|]+)
是一个捕获组(将其内容推送到matcher.group(1)
),与+
以外的一个或多个(|
)字符匹配([^|]
1}}否定的字符类)。
答案 1 :(得分:1)
使用模式捕获两个值更简单。这是regex使用的:
Object No:([^|]*)\| Item ID: (\d*)
由regex101生成的代码,用于匹配您想要的输出。
final String regex = "Object No: ([^|]*)\\| Item ID: (\\d*)";
final String string = "Object No: NEW D City | Item ID: 1259669";
final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println(+ i + ": " + matcher.group(i));
}
}
输出:
1: NEW D City
2: 1259669
类似但更基本的解决方案是[^:]*[:\s]*([^|]*)\|[^:]*[:\s]*(\d*)
(不完美,我没有尝试做一些有效的事情)