Java 动态正则表达式返回false,而静态正则表达式返回true

Java 动态正则表达式返回false,而静态正则表达式返回true,java,regex,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++) { Patte

出于某种原因,
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
        }
    }
}
String[]字符串={
“MSG://1/3/data1”,
“MSG://3/3/data3”
“MSG://2/3/data2”,
};
for(int i=0;i

在上面的代码中,未注释的
thePattern=…
行将导致
matcher.find()
始终返回false。但是,如果您对该行进行注释,并在其下方取消对该行的注释,则它将按照预期的方式工作。我想从
int
String
的转换过程中会发生一些事情,但我不是Java大师。非常感谢任何人提供的任何帮助。

我只是猜测,但如果您打算按照
MSG://1
MSG://2
MSG://3
的顺序解析数据,请尝试将
strings[j]
更改为
strings[I]

或者你们可以将图案的创建移动到外循环,并在内循环中使用它。这样,您仍然可以迭代
字符串[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++) {

好的,所以我在使用OracleJDK时似乎没有问题。但是,当我使用OpenJDK时,无论我如何尝试使用
indexOf()
contains()
查找正确的消息并提取数据,我总是会失败。我甚至使用了一个
StringBuilder
对象来构建模式,但仍然存在匹配问题


所以我将把这归因于OpenJDK中的一个bug,然后继续。感谢您对
模式
对象@Pshemo的建议。谢谢大家的帮助。

我对这两行都有相同的结果,因为消息可能出现了问题,正在重新构建。字符串中的第一个数字不应该是
1
2
3
而不是
1
3
2
?另外,您没有在任何地方使用
i
。@Pshemo似乎您已经发现了问题。实际上,我从
“MSG://2/3/data2”
后面的逗号假设OP无意中在IDE和SO之间交换了整行内容。但是,当我们不得不猜测代码实际应该是什么时,它就糟透了。实际上,按照@Pshemo的建议,将
模式
对象移动到外部循环,就解决了这个问题。不知道为什么,但是哦好吧。。。
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