2013-11-25 3 views
0

По какой-то причине Matcher.find() возвращает false, когда он должен возвращать true. Пожалуйста, проверьте код ниже:Динамическое регулярное выражение возвращает false, когда статическое регулярное выражение возвращает true

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() к всегда возвращение ложным. Но если вы прокомментируете эту строку и раскомментируете строку под ней, она работает так, как и следовало ожидать. Я думаю, что что-то происходит в конверсии от int до String, но я не являюсь Java-гуру. Любая помощь, которую может предложить любой человек, очень ценится.

+2

У меня такой же результат с обеими линиями – mdolbin

+0

Почему вложенные петли? – anubhava

+0

Поскольку сообщения могут быть не в порядке и подлежат реконструированию. –

ответ

0

Я просто предполагаю, но если ваше намерение состоит в том, чтобы проанализировать данные, чтобы MSG://1, MSG://2, MSG://3 затем попытайтесь изменить strings[j] к strings[i].

Или вы можете перемещать создание шаблона во внешний цикл и использовать его во внутреннем. Таким образом, вы все равно можете перебирать 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 
0

ОК, так что я, кажется, не имеют проблемы при использовании Oracle JDK. Но когда я использую OpenJDK, независимо от того, как я пытаюсь найти правильное сообщение и извлекать данные, используя indexOf() или , у меня остаются сбои. Я даже использовал объект StringBuilder для создания шаблона и по-прежнему получаю проблемы с сопоставлением.

Так что я собираюсь сделать это с ошибкой в ​​OpenJDK и двигаться дальше. Спасибо за совет по объекту Pattern @Pshemo. И спасибо, всем остальным, за ваши усилия, чтобы помочь.

+0

Фактически, перемещение объекта «Pattern» во внешний цикл, как это было предложено @Pshemo. Не знаю, почему, но хорошо ... –

Смежные вопросы