Является ли regex в Java привязанным по умолчанию с символом ^ и $?

Из моего понимания регулярных выражений строка "00 ###" должна совпадать с "[0-9]", но не с "^ [0-9] $". Но он не работает с Java regexp's.

После некоторого изучения этой проблемы я нашел следующую информацию (http://www.wellho.net/solutions/java-regular-expressions-in-java.html):

Может показаться, что Java выражения по умолчанию привязаны к оба символа a и $.

Можно ли быть уверенным, что это верно для всех версий JDK? И можно ли отключить этот режим (т.е. Отключить привязку по умолчанию с помощью ^ и $)?

Ответы

Ответ 1

Как вы объяснили в статье, это зависит от функции, которую вы вызываете. Если вы хотите добавить ^ и $по умолчанию, используйте String#matches или Matcher#matches. Если вы этого не хотите, используйте Matcher#find.

import java.util.regex.*;

public class Example
{
    public static void main(String[] args)
    {
        System.out.println("Matches: " + "abc".matches("a+"));

        Matcher matcher = Pattern.compile("a+").matcher("abc");
        System.out.println("Find: " + matcher.find());
    }
}

Вывод:

Matches: false
Find: true

Ответ 2

В дополнение к Mr. Байерс отвечает, обратите внимание также, что Matcher#find() поднимается там, где его последний успешный матч прекратился. Это имеет значение только для повторного использования экземпляра Matcher, но эта функция позволяет эмуляцию утверждения Perl \G. Он также полезен совместно с Matcher#usePattern(Pattern), где вы используете один шаблон для поиска некоторого префикса и затем заменяете повторяющимся шаблоном (в том числе \G) для циклического повторения совпадений с Matcher#find().

Там также Matcher#lookingAt(), который неявно ограничен в начале (^), но не в конце. Я предпочитаю думать, что имя было вдохновлено функцией Emacs looking-at.

Ответ 3

Да, matches() всегда действует так, как если бы регулярное выражение было привязано с обоих концов. Чтобы получить традиционное поведение, которое должно соответствовать любой подстроке цели, вы должны использовать find() (как уже указывали другие). Очень мало инструментов регулярных выражений предлагают что-либо, эквивалентное методам Java matches(), поэтому ваше замешательство оправдано. Единственный другой, о котором я могу думать, - это XML Schema.