Java正则解析问题求助:仅匹配D值,无法匹配S/P/H
解决正则仅匹配D值的问题
嘿,我帮你分析下问题所在,你的正则表达式确实有几个小问题导致S/P/H匹配不到:
问题诊断
- 多余的前导空格:你正则里S/P/H分支前面加了空格(比如
([0-9]+)[S|s]),但你已经把输入按空格分割成了单个元素(比如"2S"),这些元素前面没有空格,所以后面的分支根本匹配不上。 - 错误的字符类写法:
[D|d]这种写法会匹配D、|、d三个字符,而不是你想要的大小写D,正确的写法是[Dd](字符类里的字符默认是“或”的关系,不需要加|)。 - 分支匹配优先级问题:正则引擎是从左到右匹配分支,一旦匹配到第一个符合的分支(也就是D的情况)就会停止,即使后面还有S/P/H的内容,也不会继续匹配。
修正方案
既然你已经按空格分割了输入,那我们可以针对每个分割后的元素单独匹配,这样逻辑更清晰。
修正后的代码示例
import java.util.regex.Matcher; import java.util.regex.Pattern; public class ParseStack { // 匹配数字+类型的正则,捕获数字和类型字符 private static final Pattern ITEM_PATTERN = Pattern.compile("(\\d+)([DdSsPpHh])"); public ParseStack() { // 你的构造函数逻辑 } public void parseInput(String input) { // 用\\s+分割,处理多个连续空格的情况 String[] items = input.split("\\s+"); for (String item : items) { Matcher matcher = ITEM_PATTERN.matcher(item); if (matcher.matches()) { int value = Integer.parseInt(matcher.group(1)); // 统一转成大写,方便判断 String type = matcher.group(2).toUpperCase(); switch (type) { case "D": System.out.println("D对应的值:" + value); break; case "S": System.out.println("S对应的值:" + value); break; case "P": System.out.println("P对应的值:" + value); break; case "H": System.out.println("H对应的值:" + value); break; } } } } public static void main(String[] args) { ParseStack parser = new ParseStack(); // 测试输入 parser.parseInput("3D 5S 2P 7H"); } }
如果你不想分割字符串(直接匹配整个输入)
也可以用全局匹配的方式,循环找出所有匹配项:
public void parseWholeInput(String input) { Pattern pattern = Pattern.compile("(\\d+)[Dd]|(\\d+)[Ss]|(\\d+)[Pp]|(\\d+)[Hh]"); Matcher matcher = pattern.matcher(input); while (matcher.find()) { // 检查哪个分组有值,对应不同类型 if (matcher.group(1) != null) { System.out.println("D对应的值:" + matcher.group(1)); } else if (matcher.group(2) != null) { System.out.println("S对应的值:" + matcher.group(2)); } else if (matcher.group(3) != null) { System.out.println("P对应的值:" + matcher.group(3)); } else if (matcher.group(4) != null) { System.out.println("H对应的值:" + matcher.group(4)); } } }
总结
优先推荐第一种“分割后逐个匹配”的方式,逻辑更直观,也不容易出错。核心就是去掉正则里多余的空格,修正字符类的写法,让每个元素都能被正确匹配到。
内容的提问来源于stack exchange,提问作者Smurf1
相关产品推荐
相关产品推荐

