当静态正则表达式返回true时,动态正则表达式返回false

时间:2013-11-25 19:11:05

标签: java regex

由于某种原因,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。但是如果你评论那条线,并取消注释它下面的线,它就像人们期望的那样工作。我认为从intString的转换正在发生一些事情,但我不是Java大师。任何人都可以提供的帮助非常感谢。

2 个答案:

答案 0 :(得分:0)

我只是在猜测,但如果您打算按照MSG://1MSG://2MSG://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的建议。并且感谢其他所有人,感谢您的努力。