Сопоставитель шаблонов Java сообщает, что совпадение не найдено, но совпадения выводятся на консоль

#java #regex #matcher

#java #регулярное выражение #сопоставитель

Вопрос:

Я написал сопоставитель для сопоставления из следующего текста.

 <TD><P>xyz...  </P><P>Oiuye </P><P>Oture, </P><P>Option</P></TD><TD><P> EUR 0.20 </P></TD><Span></Span>     
<TD><P>Foriegn </P></TD><TD><P> EUR 0.30 </P></TD><Span></Span>
  

Шаблон, который я хочу использовать, это:-

 Pattern p = Pattern.compile("\</TD\>\<TD\>\<P\>(.*?)\</P\>");Matcher m_Fee_1 = p_Fee_1.matcher(row_xml);          
m_Fee_1.find();
String Contract_Fee_Temp = m_Fee_1.group(1).trim(); 
  

Мне нужно захватить 0,20 евро и 0,30 евро.

Моя консоль показывает 0,20 евро 0,30 евро

И выдает ошибку, совпадение не найдено. Почему это происходит? Ничего, если я просто поймаю это исключение и возьму данные? Или как мне с этим справиться?

Комментарии:

1. Как вы используете сопоставитель ?. покажите нам код.

2. В качестве примечания к сайту вам не нужны все обратные косые черты тезисов: Pattern.compile("</TD><TD><P>(.*?)</P>") тоже подойдет, простой и читаемый…

Ответ №1:

Я полагаю, вы неправильно используете сопоставитель:

     String[] str = new String[]{"<TD><P>xyz...  </P><P>Oiuye </P><P>Oture, </P><P>Option</P></TD><TD><P> EUR 0.20 </P></TD><Span></Span> ", "<TD><P>Foriegn </P></TD><TD><P> EUR 0.30 </P></TD><Span></Span>"};
    Pattern p = Pattern.compile("\</TD\>\<TD\>\<P\>(.*?)\</P\>");
    for (String st : str) {
        Matcher m = p.matcher(st);
        while (m.find()) {
            System.out.println(m.group(1));
        }
    }
  

Выдает:

 EUR 0.20 
EUR 0.30
  

Комментарии:

1. Он EUR 0.30 также хочет сопоставить

2. @AvinashRaj: код также работал для второго примера. Я опустил его, чтобы избежать беспорядка. В любом случае, я обновил ответ, чтобы включить оба сценария.

Ответ №2:

Вы просто можете перехватить исключение, если вы уже получаете то, что вам нужно.

 try{
Pattern p = Pattern.compile("\</TD\>\<TD\>\<P\>(.*?)\</P\>");Matcher m_Fee_1 = p_Fee_1.matcher(row_xml);          
m_Fee_1.find();
String Contract_Fee_Temp = m_Fee_1.group(1).trim(); 
//Print what ever you want
}
catch(IllegalStateException exception){}