Matcher.Find () возвращает false, когда оно должно быть истинным - PullRequest
0 голосов
/ 12 апреля 2011
        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));
        ...

Это текст, который я использую:

Здесь есть текст

topicTitle test:test1: testing123test2: testing456test3: testing789test4: testing9097

Когда я тестирую это регулярное выражение на http://regexpal.com/ или http://www.regexplanet.com, я четко нахожу заголовок, который говорит: "topicTitle test".Но в моем Java-коде topicTitleFound возвращает false.

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

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

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

Чтобы сделать ваш многострочный шаблон более надежным, попробуйте использовать опцию MULTILINE при компиляции регулярного выражения. Затем используйте ^ и $ по мере необходимости, чтобы соответствовать границам линий.

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

Обновление:

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

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

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

int i = matcher.start(0);
0 голосов
/ 12 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...