正则表达式模式/匹配器的问题

时间:2016-12-13 21:02:58

标签: java regex matcher

String s2 = "K000";
Pattern p2 = Pattern.compile("/^.*([A-Z])/");
Matcher m2 = p2.matcher(s2);

if (m2.find()) {    
    int pos2 = m2.end();
    a2 = s2.substring(0,pos2);
    n2 = s2.substring(pos2);
}

我希望a2被赋值为“K”而n2被赋值为“000”,但m2.find()从不求值为true,因此从不处理条件语句。我在一个在线正则表达式测试器上仔细检查了我的正则表达式模式,对于这个字符串和这个模式,它返回K作为匹配。知道我在这里做错了吗?

最终,我需要发生的是能够从头开始将s2一直分配到找到a2的最后一个capitol alpha以及在最后一个capitol alpha到n2之后出现的任何小写,数字,特殊字符。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

/是Javascript正则表达式分隔符,您不能在Java中使用它们。您可能使用过Javascript正则表达式测试程序。

See this example:

public static void main(String[] args) {
    String s2 = "K000";
    String a2 = "";
    String n2 = "";

    Pattern p2 = Pattern.compile("^.*([A-Z])");
    Matcher m2 = p2.matcher(s2);
    if (m2.find()) {
        int pos2 = m2.end();
        a2 = s2.substring(0, pos2);
        n2 = s2.substring(pos2);
    }

    System.out.println(a2); // K
    System.out.println(n2); // 000
}

请注意,您还可以使用其他模式,这看起来更简单(并让匹配器为您完成工作)。

See this example:

public static void main(String[] args) {
    String s2 = "K000";
    String a2 = "";
    String n2 = "";

    Pattern p2 = Pattern.compile("([A-Z]+)(.+)");
    Matcher m2 = p2.matcher(s2);
    if (m2.matches()) {
        a2 = m2.group(1);
        n2 = m2.group(2);
    }

    System.out.println(a2); // K
    System.out.println(n2); // 000
}

(如果您不想要至少一个字符,请+替换*

答案 1 :(得分:0)

只需从正则表达式中移除^.*([A-Z])即可。

因此,您的最终正则表达式将为Pattern,并且Pattern p2 = Pattern.compile("^.*([A-Z])"); 对象将按如下方式创建:

{{1}}

这将为您提供所需的结果。