Является ли 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.