#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:
Ваше регулярное выражение немного сложно расшифровать — не совсем очевидно, что вы пытаетесь сделать. Одна вещь, которая приходит на ум, заключается в том, что ваше регулярное выражение ожидает, что совпадение начнется с новой строки, а ваш образец текста — нет.