java正则表达式匹配为空

时间:2015-02-05 04:55:34

标签: java regex match

我试图找到一个特定的模式,但也排除某些模式。出于某种原因,我的正则表达式不适用于我的程序,但它适用于在线正则表达式测试程序。有什么问题?

以下是在线测试:regex101

这是java测试:

private void TestRegex() {

    ArrayList<String> strings = new ArrayList<>();
    strings.add("Every Witch Way 3x19 New Witch Order (2015)");
    strings.add("The Tonight Show Starring Jimmy Fallon Episode dated 22 January 2015 (2015)");
    strings.add("October Gale (2014)");
    strings.add("Kung Pow: Enter the Fist (2002)");

    Pattern pattern = Pattern.compile("^((?!.*(\\d*x\\d*|Episode dated)).*) \\((\\d*)\\)$");

    for (String s : strings) {

        Matcher matcher = pattern.matcher(s);
        while (matcher.find()) {

            Log.d("TAG1", s);
            for (int j=0; j<matcher.groupCount(); j++) {
                Log.d("TAG2", "Match " + j + ": " + matcher.group(j));
            }
        }
    }

}

以下是我测试的输出:

... D/TAG1﹕ October Gale (2014)
... D/TAG2﹕ Match 0: October Gale (2014)
... D/TAG2﹕ Match 1: October Gale
... D/TAG2﹕ Match 2: null
... D/TAG1﹕ Kung Pow: Enter the Fist (2002)
... D/TAG2﹕ Match 0: Kung Pow: Enter the Fist (2002)
... D/TAG2﹕ Match 1: Kung Pow: Enter the Fist
... D/TAG2﹕ Match 2: null

为什么匹配2为空?在在线匹配器中,它与两者都正确匹配。

正则表达式字符串的解释:

我希望将所有字符串与Movie Title (Year)格式匹配,并忽略包含字符串\d*x\d*的所有字符串(示例:1x012x053x11 )或包含字符串Episode dated,因为这些字符串指的是电视节目剧集,而不是电影,我试图分开。我还需要匹配电影标题以及年份。

2 个答案:

答案 0 :(得分:4)

问题主要是这个j<matcher.groupCount()条件。您有三个组,但此条件只会打印除组0之外的两个组。通过将<设置为<=,您也可以帮助您打印最后一组。

for (int j=0; j<=matcher.groupCount(); j++) {
                Log.d("TAG2", "Match " + j + ": " + matcher.group(j));
  

为什么匹配2为空?

这是因为捕获组存在于负前瞻断言中。像其他回答者所说的那样,将捕获组转变为非捕获组不会创造额外的组。

Group 0 = Prints the entire match
Group 1 = Prints the characters which are present inside the group index 1.
Group 2 = Prints the characters which are present inside group index 2. Likewise it goes on.

答案 1 :(得分:2)

^((?!.*(?:\d*x\d*|Episode dated)).*) \((\d*)\)$

 ^^     ^^                               ^^


Group1   Group2                          Group3  

Group2是您获得的空组。在regex101.com中,您的2002年匹配group 3。使第二组无法捕获。

当你的字符串匹配时,由于负前瞻Group2不能存在。所以它将为空。

参见演示。

https://www.regex101.com/r/oI2jF9/2