【问题标题】:Pattern matching troubles [duplicate]模式匹配问题[重复]
【发布时间】:2025-12-15 08:50:02
【问题描述】:

所以我有一个看起来像这样的函数:

private int getNumber(String commandChunk)
    {
        Pattern pattern = Pattern.compile("R(\\d+)");
        Matcher m = pattern.matcher(commandChunk);
        return Integer.parseInt(m.group(1));
    }

用“R0”调用。我希望它返回 int: 0,但是我在 return 语句中得到了一个非法的状态异常。我究竟做错了什么?我不明白为什么我不能说 int myNum = getNumber("R0")myNum = 0 结尾。

【问题讨论】:

  • 为了 FSM 的爱,让 Pattern 成为一个常数。为什么每次调用方法都要重新编译?

标签: java regex


【解决方案1】:

group 如果前面没有matchesfind,则抛出IllegalStateException。在调用group 之前调用matches,以便表达式匹配完整的String

class NumberTest {
    final static Pattern pattern = Pattern.compile("R(\\d+)");

    public static void main(String[] args) {
        System.out.println(new NumberTest().getNumber("R0"));
    }

    private int getNumber(String commandChunk) {
        Matcher m = pattern.matcher(commandChunk);
        if (m.matches()) {
            return Integer.parseInt(m.group(1));
        } else {
            return -1;
        }
    }
}

【讨论】:

  • 引用 javadoc,"匹配器的显式状态最初是未定义的;在成功匹配之前尝试查询它的任何部分将导致抛出 IllegalStateException。每个匹配操作都会重新计算一个匹配器。”
  • 我的正则表达式呢?为什么它不匹配一个组?
  • 因为你没有调用matches(或find),所以它会在表达式匹配之前抛出IllegalStateException。查看添加的演示
  • 啊,我明白了。谢谢!