仅当选中匹配时,Java正则表达式才匹配

时间:2011-08-12 02:24:35

标签: java regex conditional

在课堂内我有一个模式private Pattern lossWer = Pattern.compile("^\\d+ \\d+ (\\d+).*")。其中一个功能如下:

public double[] getWer(){
    double[] wer = new double[someStrings.size()];
    Matcher m;
    for(int i = 0; i < wer.length; i++){
        m = lossWer.matcher(someStrings.get(i));
        wer[i] = Double.parseDouble(m.group(1));
    }
    return wer;
}

使用java.lang.IllegalStateException: No match found调用此方法失败。但是,当我将其更改为此时,它可以正常工作:

public double[] getWer(){
    double[] wer = new double[someStrings.size()];
    Matcher m;
    for(int i = 0; i < wer.length; i++){
        m = lossWer.matcher(someStrings.get(i));
        if(!m.matches())
            ;
        wer[i] = Double.parseDouble(m.group(1));
    }
    return wer;
}

当然我的应用程序不只是为该行使用空格分号,但我说明这里的行什么都不做但只允许程序继续进行而不会出错。为什么第二个示例中的行匹配没有错误,而第一个示例中没有;

3 个答案:

答案 0 :(得分:4)

如果没有先致电group()find(),您就无法使用matches()。这就是正则表达式的工作方式。首先你创建一个模式,然后是一个匹配器,然后你找到()正则表达式的实例或检查它是否匹配()。

答案 1 :(得分:3)

检查this是否存在IllegalStateException

  

匹配器的显式状态最初是未定义的;试图   在成功匹配之前查询它的任何部分将导致   抛出IllegalStateException。匹配器的显式状态是   每次比赛操作重新计算。

这与Ryan的回答相结合,可以满足您的需求。

答案 2 :(得分:1)

在致电m.matches()之前,您尚未测试正则表达式,因此没有任何组。

你说在那条线上,对正则表达式进行测试。如果没有匹配什么都不做,那么你继续检查匹配的组(1)(因为它与一个组有匹配)。

最好改变:

    if(!m.matches())
        ;
    wer[i] = Double.parseDouble(m.group(1));

要:

    if(m.matches())
        wer[i] = Double.parseDouble(m.group(1));

或使用!m.matches()返回错误或其他内容。您的选择:)