由于某种原因,Matcher.find()
在返回true时返回false。请查看以下代码:
String[] strings = {
"MSG://1/3/data1",
"MSG://3/3/data3"
"MSG://2/3/data2",
};
for (int i = 0; i < strings.length; i++) {
for (int j = 0; j < strings.length; j++) {
Pattern thePattern = Pattern.compile("^MSG://" + (j+1) + "/(.*)");
//Pattern thePattern = Pattern.compile("^MSG://1/(.*)");
Matcher theMatcher = thePattern.matcher(strings[j]);
if (theMatcher.find()) {
// Do something
}
else {
// Do something else
}
}
}
在上面的代码中,未注释的thePattern = ...
行会导致theMatcher.find()
始终返回false。但是如果你评论那条线,并取消注释它下面的线,它就像人们期望的那样工作。我认为从int
到String
的转换正在发生一些事情,但我不是Java大师。任何人都可以提供的帮助非常感谢。
答案 0 :(得分:0)
我只是在猜测,但如果您打算按照MSG://1
,MSG://2
,MSG://3
的顺序解析数据,请尝试将strings[j]
更改为strings[i]
。
或者您可以将Pattern的创建移动到外部循环并在内部循环中使用它。通过这种方式,您仍然可以迭代strings[j]
,而不必编译模式n^n
次,只需n
次。
我的意思是
for (int i = 0; i < strings.length; i++) {
Pattern thePattern = Pattern.compile("^MSG://" + (i+1) + "/(.*)");
for (int j = 0; j < strings.length; j++) {
而不是
for (int i = 0; i < strings.length; i++) {
for (int j = 0; j < strings.length; j++) {
Pattern thePattern = Pattern.compile("^MSG://" + (j+1) + "/(.*)");
结果:
MSG://1/3/data1
MSG://2/3/data2
MSG://3/3/data3
答案 1 :(得分:0)
好的,所以在使用Oracle JDK时似乎没有问题。但是当我使用OpenJDK时,无论我如何尝试找到正确的消息并使用indexOf()
或contains()
提取数据,我都会遇到失败。我甚至使用StringBuilder
对象来构建模式,但仍然遇到匹配问题。
因此,我将把这一点归结为OpenJDK中的一个错误并继续前进。感谢您对Pattern
对象@Pshemo的建议。并且感谢其他所有人,感谢您的努力。