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