【问题标题】:Java Regex Matching Groups Bug?Java 正则表达式匹配组错误?
【发布时间】:2016-02-20 10:15:02
【问题描述】:

我已经使用 swing 组件编写了一个基本的 CLI,并且正在使用 Regex 来识别命令。

我遇到了一些奇怪的事情,我无法解释。我在这里做错了什么?

这是我的代码:

class GraphCommandFactory {

private final GraphSearchController controller;
private final GraphSearchModel model;
private final ArrayList<Pattern> commands;

public GraphCommandFactory(GraphSearchController controller, GraphSearchModel model) {
    this.model = model;
    this.controller = controller;
    this.commands = new ArrayList<>();

    commands.add(Pattern.compile("SET START ([A-Z]{4,8})"));
}

public Command createCommand(String commandString) {
    Command returnCommand;

    // Test the string against each regex
    int command = 0;
    Matcher matcher = commands.get(command).matcher(commandString);
    ...

private String[] extractArguments(Matcher matcher) {
    String[] arguments = new String[matcher.groupCount()];

    for (int i = 0, j = matcher.groupCount(); i < j; i++) {
        arguments[i] = matcher.group(i);
    }

    return arguments;
}

问题在于 extractArguments 函数...使用模式(在匹配器中):

Pattern.compile("SET START ([A-Z]{4,8})"));

输掉最后一组。但是,如果我将其修改为:

Pattern.compile("SET START ([A-Z]{4,8})()"));

然后它正确地捕获了我想要的。

我是否误解了如何使用正则表达式、模式和匹配器?或者这是最后一个捕获组丢失的错误?

我使用 Java SDK 1.8 和 Netbeans 作为我的 IDE。使用调试工具让我无所适从。

【问题讨论】:

    标签: java regex


    【解决方案1】:

    问题出在你的 for 循环中:

    for (int i = 0, j = matcher.groupCount(); i < j; i++) {
        arguments[i] = matcher.group(i);
    }
    

    因为你只循环比matcher.groupCount少1个

    将其更改为:

    for (int i = 0; i <= matcher.groupCount(); i++) {
        arguments[i] = matcher.group(i);
    }
    

    根据 Javadoc:

    groupCount 返回此匹配器模式中的捕获组数。 按照惯例,零组表示整个模式。它不包括在此计数中。

    【讨论】:

    • 谢谢!习惯的力量。我还需要为 String[] 参数添加一个额外的数组槽,因为我想在失败的情况下保留原始命令。
    • 它也可以更改为arguments[i] = matcher.group(i+1);,同时保留for (int i = 0, j = matcher.groupCount(); i &lt; j; i++) { 的现有值,因为OP 对提取整个匹配表达式不感兴趣,而只是对其中的参数感兴趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2011-03-30
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多