Java Regex占用太多

时间:2016-06-27 18:04:17

标签: java regex

我已经将我的案例简化为最简单的示例,但我仍然无法在Java和Python中使用它。这是我的Java代码:

    public static void main(String[] args) {

    String searchPattern = "gov.noaa.mgdc.mgg.dem:393";
    String regExToApply = ":(.+)$";

    Pattern pattern = Pattern.compile(regExToApply);
    Matcher matcher = pattern.matcher(searchPattern);

    while (matcher.find()) {
        System.out.println("Match is: \"" + matcher.group() + "\"");
        //Output: Match is: ":393"
    }


}

在Python中,regEx“:(。+)$”只匹配393,这就是我想要的,但在Java中,它匹配:393。我试过特别列出:作为一个非捕获组,“(?::)(。+)$”,我得到相同的结果。我也注意到删除了括号,“:。+ $”似乎没什么区别。

如何在Java中捕获上面字符串中的393?我还需要一个单独的字符串来捕获冒号之前的所有内容,也不包括冒号。谢谢!

3 个答案:

答案 0 :(得分:4)

只使用正则表达式中定义的捕获组而不是matcher.group()返回的整个匹配表达式

System.out.println("Match is: \"" + matcher.group(1) + "\"");
                                                  ^
               captured group 1  -----------------|

答案 1 :(得分:2)

在没有任何参数的情况下调用matcher.group()与调用matcher.group(0)相同,根据API文档,它会返回整个模式的匹配项。

请参阅API文档:https://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#group(int)

要使用一组括号匹配组,您必须指定一个大于0的数字。您要查找的是第1组。

System.out.println("Match is: \"" + matcher.group(1) + "\"");

答案 2 :(得分:0)

在Python中,您使用的是findall(),不是吗?这种方法有点奇怪。如果正则表达式中没有捕获组,则它仅列出完整匹配,但如果 捕获组,则仅列出组。完整的匹配仍然存在,它只是没有显示给你。

如果您使用search()方法获取match对象,那么您会发现自己拥有与Java相同的选项:group()group(0)检索整个匹配(:393)或group(1)以获取您感兴趣的部分(393)。

每种语言对正则表达式采取不同的方法,它们都会做出一些令人惊讶的选择。例如,在Java中,matches()是一个动词,意思是“此正则表达式描述整个字符串”,但在.NET中,Matches()是一个名词,意思是“这个正则表达式可能有一个或多个匹配字符串;这是所有它们的列表“。不要把任何事情视为理所当然。