Java регулярное выражение путаница - PullRequest
2 голосов
/ 08 сентября 2010

У меня есть следующий (Java) код:

public class TestBlah {
    private static final String PATTERN = ".*\\$\\{[.a-zA-Z0-9]+\\}.*";

    public static void main(String[] s) throws IOException {
        String st = "foo ${bar}\n";

        System.out.println(st.matches(PATTERN));
        System.out.println(Pattern.compile(PATTERN).matcher(st).find());
        System.exit(0);
    }
}

При выполнении этого кода первый System.out.println выводит false, а второй выводит true

Am Iне понимаете что-то здесь?

Ответы [ 3 ]

3 голосов
/ 08 сентября 2010

Это потому, что . не будет соответствовать символу новой строки. Таким образом, ваша строка, содержащая новую строку, не будет соответствовать строке, которая заканчивается на .*. Итак, когда вы вызываете matches(), он возвращает false, потому что новая строка не совпадает.

Второй возвращает true, потому что он находит совпадение во входной строке. Это не обязательно соответствует всей строке.

С Pattern Javadocs :

. Любой символ (может совпадать или не совпадать с ограничителями строки)

1 голос
/ 08 сентября 2010

String.matches(..) ведет себя как Matcher.matches(..).Из документации Matcher

find(): Attempts to find the next subsequence of 
        the input sequence that matches the pattern.

matches(): Attempts to match the entire input sequence 
        against the pattern.

Таким образом, вы можете думать о matches(), как если бы он окружал ваше регулярное выражение ^ и $, чтобы убедиться в начале строкисоответствует началу вашего регулярного выражения, а конец строки соответствует концу регулярного выражения.

0 голосов
/ 08 сентября 2010

Существует разница между сопоставлением шаблона и поиском шаблона в строке

  • String.matches():

    Сообщаетсоответствует ли эта строка заданному регулярному выражению.

    Вся ваша строка должна соответствовать шаблону.

  • Matcher.matches():

    Попытки сопоставить всю последовательность ввода с шаблоном.

    И снова вся ваша строка должна совпадать.

  • Matcher.find():

    Пытается найти следующую подпоследовательность входной последовательности, которая соответствует шаблону.

    Здесь вам нужно только "частичное совпадение".


Как сказал @Justin:
Ваш matches() не может работать, поскольку . не будет соответствовать символам новой строки (\n, \r и \r\n).


Ресурсы:

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