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

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

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

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

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

20
задан DixonD 2 November 2017 в 09:15
поделиться

3 ответа

Как объясняется в статье, на которую вы ссылаетесь, это зависит от функции, которую вы вызываете. Если вы хотите добавить ^ и $ по умолчанию, используйте String # соответствует или Matcher # соответствует . Если вы этого не хотите, используйте вместо этого метод 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
24
ответ дан 30 November 2019 в 00:27
поделиться

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

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

4
ответ дан 30 November 2019 в 00:27
поделиться

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

4
ответ дан 30 November 2019 в 00:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: