我有一组字符串需要解析并从中提取值。它们看起来像:
/apple/1212d3fe
/cat/23224a2f4
/auto/445478eefd
/somethingelse/1234fded
它应该只匹配 apple、cat 和 auto。我期望的输出是:
1212, d3fe
23224, a2f4
445478, eefd
null
我需要想出一个正则表达式来捕获组来执行相同的操作。我能够提取第二部分,但不能提取第一部分。我想出的最接近的是:
String r2 = "^/(apple/[0-9]{4}|cat/[0-9]{5}|auto/[0-9]{6})([a-f0-9]{4})$";
System.out.println(r2);
Pattern pattern2 = Pattern.compile(r2);
Matcher matcher2 = pattern2.matcher("/apple/2323efff");
if (matcher2.find()) {
System.out.println(matcher2.group(1));
System.out.println(matcher2.group(2));
}
<小时/>
更新的问题:
我有一组字符串需要解析并从中提取值。它们看起来像:
/apple/1212d3fe
/cat/23e24a2f4
/auto/df5478eefd
/somethingelse/1234fded
它应该只匹配 apple、cat 和 auto。我期望的输出是第二个“/”分割后的所有内容,如下所示:如果“apple”则为 4 个字符,如果“cat”则为 5 个字符,如果“auto”则为 6 个字符,如下所示:
1212, d3fe
23e24, a2f4
df5478, eefd
null
我需要想出一个正则表达式来捕获组来执行相同的操作。我能够提取第二部分,但不能提取第一部分。我想出的最接近的是:
String r2 = "^/(apple/[0-9]{4}|cat/[0-9]{5}|auto/[0-9]{6})([a-f0-9]{4})$";
System.out.println(r2);
Pattern pattern2 = Pattern.compile(r2);
Matcher matcher2 = pattern2.matcher("/apple/2323efff");
if (matcher2.find()) {
System.out.println(matcher2.group(1));
System.out.println(matcher2.group(2));
}
<小时/>
我可以在没有正则表达式 OR(|) 的情况下做到这一点,但当我包含它时它会中断。有关正确正则表达式的任何帮助吗?
最佳答案
更新的答案:
根据您更新的问题,您可以根据后向断言使用此正则表达式:
/((?<=apple/).{4}|(?<=cat/).{5}|(?<=auto/).{6})(.+)$
- 此正则表达式在匹配
/
后使用 2 个捕获组 - 在第一组中,我们有 3 个交替的回顾条件。
-
(?<=apple/).{4}
确保我们匹配 4 个具有apple/
的字符在左侧。同样,我们匹配具有cat/
的 5 和 6 个字符串。和/auto/
. - 在第二个捕获组中,我们匹配行尾之前的剩余字符。
关于java - 正则表达式捕获逻辑 OR 中的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57633035/