Java 17复杂正则表达式求助:匹配Metric Set并提取分段
Java 17 正则匹配与提取 Metric Set 分段
正则规则拆解
先明确每个Token的正则片段(Java字符串需转义特殊字符):
- Distance Token:
\\d+"→ 匹配1个以上数字加双引号(如12") - Numeric Token:
-?\\d+→ 匹配带可选负号的数字(如-4、2) - Random Token:
\\d*D[36]→ 匹配可选数字前缀加D3/D6(如12D3、D6) - Not-applicable Token:
N/A→ 精确匹配该字符串 - Greater-than Token:
\\d+\\+→ 匹配1个以上数字加+(如3+) - Ignorables Token:
Melee|Ranged→ 精确匹配两个指定字符串
再根据各Segment允许的Token组合,拼接出每段的正则:
- 第1段: 允许Distance、Random、Ignorables、Not-applicable →
(\\d+"|\\d*D[36]|Melee|Ranged|N/A) - 第2、4、5、6段: 允许Numeric、Random、Not-applicable、Greater-than →
(-?\\d+|\\d*D[36]|N/A|\\d+\\+) - 第3段: 允许Greater-than、Random、Not-applicable →
(\\d+\\+|\\d*D[36]|N/A)
完整Java 17实现代码
import java.util.regex.Matcher; import java.util.regex.Pattern; public class MetricSetMatcher { public static void main(String[] args) { // 构建完整正则表达式:匹配6个Segment,用1个或多个空白分隔 String regex = "\\b(\\d+\"|\\d*D[36]|Melee|Ranged|N/A)\\s+" + "(-?\\d+|\\d*D[36]|N/A|\\d+\\+)\\s+" + "(\\d+\\+|\\d*D[36]|N/A)\\s+" + "(-?\\d+|\\d*D[36]|N/A|\\d+\\+)\\s+" + "(-?\\d+|\\d*D[36]|N/A|\\d+\\+)\\s+" + "(-?\\d+|\\d*D[36]|N/A|\\d+\\+)\\b"; Pattern pattern = Pattern.compile(regex); // 测试示例字符串 String[] testStrings = { "Flamer [IGNORES COVER, TORRENT] 12\" D6 N/A 4 0 1", "18\" 2 3+ 9 -4 D6" }; for (String input : testStrings) { Matcher matcher = pattern.matcher(input); if (matcher.find()) { System.out.println("匹配到的Metric Set分段:"); System.out.println("第1段:" + matcher.group(1)); System.out.println("第2段:" + matcher.group(2)); System.out.println("第3段:" + matcher.group(3)); System.out.println("第4段:" + matcher.group(4)); System.out.println("第5段:" + matcher.group(5)); System.out.println("第6段:" + matcher.group(6)); System.out.println("---"); } else { System.out.println("输入字符串:\"" + input + "\" 未匹配到Metric Set"); } } } }
代码说明
- 正则编译:用
Pattern.compile()预编译正则,提升重复匹配效率 - 匹配逻辑:调用
matcher.find()查找输入字符串中的匹配子串 - 分段提取:通过
matcher.group(n)获取第n个Segment的内容(n从1到6) - 边界处理:用
\\b确保匹配的是完整的Token,避免部分匹配(比如不会把12D34误判为Random Token)
运行输出
匹配到的Metric Set分段: 第1段:12" 第2段:D6 第3段:N/A 第4段:4 第5段:0 第6段:1 --- 匹配到的Metric Set分段: 第1段:18" 第2段:2 第3段:3+ 第4段:9 第5段:-4 第6段:D6 ---
内容的提问来源于stack exchange,提问作者hotmeatballsoup
相关产品推荐
相关产品推荐

