正则表达式双拆分
regex double split
如果我想找到两个匹配项,Java 正则表达式应该是什么样子
1. NEW D City
2. 1259669
来自
Object No: NEW D City | Item ID: 1259669
我试过
(?<=:\s)\w+
但它只得到
1. NEW
2. 1259669
您可以组合使用两个拆分:
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
}
}
首先,您使用 \s*\|\s*
(包含 0+ 个空格的 |
)拆分,然后使用 :\s*
,一个冒号后跟 0+ 个空格。
另一种方法是使用 :\s*([^|]+)
pattern 并抓取 trim 第 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)
),它匹配除 |
之外的一个或多个 (+
) 字符(使用 [^|]
否定字符 class).
使用模式捕获两个值更简单。这是使用的 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*)
(不完美,我没有尝试做一些有效的事情)
如果我想找到两个匹配项,Java 正则表达式应该是什么样子
1. NEW D City
2. 1259669
来自
Object No: NEW D City | Item ID: 1259669
我试过
(?<=:\s)\w+
但它只得到
1. NEW
2. 1259669
您可以组合使用两个拆分:
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
}
}
首先,您使用 \s*\|\s*
(包含 0+ 个空格的 |
)拆分,然后使用 :\s*
,一个冒号后跟 0+ 个空格。
另一种方法是使用 :\s*([^|]+)
pattern 并抓取 trim 第 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)
),它匹配除 |
之外的一个或多个 (+
) 字符(使用 [^|]
否定字符 class).
使用模式捕获两个值更简单。这是使用的 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*)
(不完美,我没有尝试做一些有效的事情)