Совпадение.Find() возвращает false, когда оно должно быть true

#java #regex

#java #регулярное выражение

Вопрос:

         String s = "test";
        Pattern pattern = Pattern.compile("\n((\w \s*[^\n]){0,2})(\b"   s   "\b\s)((\w \s*){0,2})\n?");
        Matcher matcher = pattern.matcher(searchableText);
        boolean topicTitleFound = matcher.find();
        startIndex = 0;
        while (topicTitleFound) {
            int i = searchableText.indexOf(matcher.group(0));
            if (i > startIndex) {
                builder.append(documentText.substring(startIndex, i - 1));
        ...
  

Это текст, который я добавляю:

Здесь появляется некоторый текст

Заголовок темы test :
test1 : testing123
test2 : testing456
test3 : testing789
test4 : testing9097

Когда я тестирую это регулярное выражение на http://regexpal.com / или http://www.regexplanet.com Я четко вижу заголовок, который гласит: «Тест заголовка темы». Но в моем java-коде topicTitleFound возвращает false.

Пожалуйста, помогите

Ответ №1:

Возможно, у вас есть символы возврата каретки ( 'r' ) перед символами новой строки ( 'n' ) в вашем searchableText . Это привело бы к сбою сопоставления на границах строк.

Чтобы сделать ваш многострочный шаблон более надежным, попробуйте использовать опцию МНОГОСТРОЧНЫЙ при компиляции регулярного выражения. Затем используйте ^ и $ по мере необходимости для сопоставления границ строк.

 Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
  

Обновить:

После фактического тестирования вашего кода я вижу, что шаблон соответствует независимо от того, присутствуют возвраты каретки или нет. Другими словами, ваш код «работает» как есть, и topicTitleFound работает true тогда, когда он впервые назначен (вне while цикла).

Вы уверены, что получаете false for topicTitleFound ? Или проблема в цикле?

Кстати, использование indexOf() расточительно и неудобно, поскольку программа сопоставления уже хранит индекс, с которого начинается группа 0. Используйте это вместо:

 int i = matcher.start(0);
  

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

1. спасибо, но это не работает. Забавно, что в других местах текста с другими словами это работает отлично.

2. @Rob Hufschmitt — Что забавно, так это то, что у меня это работает просто отлично. Вы уверены, что опубликованный вами код — это то, что вы на самом деле тестируете? Сократите свой код до максимально простого варианта, который все еще воспроизводит ошибку, и опубликуйте его в точности. Определите ссылки типа searchableText с помощью литеральных строк. Завершите цикл (если это требуется для демонстрации ошибки), чтобы он скомпилировался. Опубликованный вами код работает; если у вас все еще возникают проблемы, опубликуйте неисправный код.

Ответ №2:

Ваше регулярное выражение немного сложно расшифровать — не совсем очевидно, что вы пытаетесь сделать. Одна вещь, которая приходит на ум, заключается в том, что ваше регулярное выражение ожидает, что совпадение начнется с новой строки, а ваш образец текста — нет.