java中的正则表达式模式失败但是工作正常

时间:2015-10-08 06:32:59

标签: java regex

我已经实施了相当复杂的pattern`来匹配所有出货号码的出现次数。它与全局不区分大小写的比较完美无缺。

我使用以下代码在Java中实现相同的功能,但它并不匹配。 Java正则表达式应该以不同的方式实现吗?

int i = 0;
while (i < elementsArray.size()) {
    System.out.println("List element:"+elementsArray.get(i));
    String theRegex = "(?i)(([Ss]{2}|Ship\\s*(set))\\s*(\\#|Number|No\\.)?\\s*([:=\\-\\n\\'\\s])?\\s*\\d+\\s*(\\W*\\d+\\W?\\s*(to|and)?|(to|and)\\s*\\d+)*)";
    if (elementsArray.get(i).matches(theRegex)) {
        System.out.println("RESULT:");
        String shipsets = "";
        String thePattern = "(?i)(([Ss]{2}|Ship\\s*(set))\\s*(\\#|Number|No\\.)?\\s*([:=\\-\\n\\'\\s])?\\s*\\d+\\s*(\\W*\\d+\\W?\\s*(to|and)?|(to|and)\\s*\\d+)*)";
        Pattern pattern = Pattern.compile(thePattern);
        Matcher matcher = pattern.matcher(elementsArray.get(i));

        if (matcher.find()) {
            shipsets = matcher.group(0);
        }

        System.out.println("text==========" + shipsets);
    }

    i++;
}

2 个答案:

答案 0 :(得分:2)

这是应该工作的代码的简化,假设您的正则表达式在Java中正常工作。从我的初步调查来看,它似乎与您链接中的许多用例相匹配。您无需使用String.matches(),因为您已使用Matcher来检查您是否匹配。

List<String> elementsArray = new ArrayList<String>();
elementsArray.add("Shipset Number 323");
elementsArray.add("meh");
elementsArray.add("SS NO. : 34");
elementsArray.add("Mary had a little lamb");
elementsArray.add("Ship Set #2, #33 to #4.");

for (int i=0; i < elementsArray.size(); ++i) {
    System.out.println("List element:"+elementsArray.get(i));
        String shipsets = "";
        String thePattern = "(?i)(([Ss]{2}|Ship\\s*(set))\\s*(\\#|Number|No\\.)?\\s*([:=\\-\\n\\'\\s])?\\s*\\d+\\s*(\\W*\\d+\\W?\\s*(to|and)?|(to|and)\\s*\\d+)*)";
        Pattern pattern = Pattern.compile(thePattern);
        Matcher matcher = pattern.matcher(elementsArray.get(i));

        if (matcher.find()) {
            shipsets = matcher.group(0);
            System.out.println("Found a match at element " + i + ": " + shipsets);
        }
    }
}

您可以在下面的输出中看到三个测试字符串全部匹配,而控件"meh""Mary had a little lamb"不匹配。

<强>输出:

List element:Shipset Number 323
Found a match at element 0: Shipset Number 323
List element:meh
List element:SS NO. : 34
Found a match at element 2: SS NO. : 34
List element:Mary had a little lamb
List element:Ship Set #2, #33 to #4.
Found a match at element 4: Ship Set #2, #33 to #4.

答案 1 :(得分:1)

在我看来,你的问题可以通过以下方式解决:

  1. matches()if(elementsArray.get(i).matches(theRegex))的使用情况 - matches()将返回 true仅当整个字符串与正则表达式匹配时才会成功,因此它将成功 您的示例中的许多情况,但它将失败: SS#1,SS#5,SS#6SS1, SS2, SS3, SS4等。您可以模拟这一点 在开头添加^并在正则表达式结尾添加$的情况。 检查它与HERE的匹配方式。所以这将是更好的解决方案,使用 在Tim中matcher.find()代替String.matches() Biegeleisen回答。
  2. 使用if(matcher.find())代替while(matcher.find()) - in 你想要检索多个字符串的一些字符串,所以你 应该多次使用matcher.find()来获取所有这些内容。 但是if只会执行一次,因此您只会先获得匹配 给定字符串的片段。要检索all,请使用循环,因为matcher.find()将在给定String中找不到下一个匹配时返回false,并将结束循环
  3. Check this out。这是Tim Biegeleisen解决方案,只有很小的变化(while,而不是if)。