Проблемы с шаблоном

#java #regex

#java #регулярное выражение

Вопрос:

У меня есть шаблон Java, которому я хотел бы соответствовать. Я хочу взять свой первоначальный шаблон и сопоставить его с первым его появлением. Тем не менее, я считаю

 public static void main(String[] args)
    {
        final String expression = "(\s*(a{1}\s*b{1})\s*)";

        Scanner scanner1 = new Scanner(" ab");
        //should be rejected
        Scanner scanner2 = new Scanner("cab");

        System.out.println(scanner1.findWithinHorizon(expression, 0));
        System.out.println(scanner2.findWithinHorizon(expression, 0));
    }
  

Когда я запускаю приведенный выше код, я получаю следующий вывод:

 ab
ab
  

Я попытался изменить шаблон, чтобы использовать неохотные и притяжательные кванторы, но, похоже, ни один из них не дает ожидаемых результатов. Что я здесь делаю не так?

Комментарии:

1. {1} является избыточным: их можно безопасно опустить.

2. @Bart Kiers Спасибо за совет. Я все еще немного новичок в этом.

Ответ №1:

Я предполагаю, что вы хотите сопоставлять только «ab», а не «cab» или «cab ab», поэтому используйте это регулярное выражение для начала строки: final String expression = "^(\s*(a{1}\s*b{1})\s*)";

Если вы хотите также сопоставить «c ab», но не «cab», попробуйте это: final String expression = "((?<!\w)\s*(a{1}\s*b{1})\s*)";

Комментарии:

1. Ну, я думаю, что первый сделал именно то, что я хотел, но не могли бы вы, пожалуйста, объяснить, как это работает? Спасибо за быстрый ответ.

2. По сути, это ваше выражение с дополнительным символом ^ впереди, что означает, что совпадение должно начинаться с начала строки. Таким образом, если строка начинается с чего угодно, кроме пробела или ‘a’, она не будет соответствовать. Второе выражение просто говорит, что не должно быть никакого символа word непосредственно перед первым ‘a’.

3. Довольно хороший сайт по регулярным выражениям можно найти здесь: regular-expressions.info

4. Подумайте об этом (?<!\w) на минуту: зачем вам вообще нужно сопоставлять (?<!w) более одного раза в одном и том же месте? (Или, в случае * или ? , почему вы хотите сделать это необязательным?) Многие варианты регулярных выражений рассматривают это как синтаксическое исключение, когда вы привязываете квантификатор к утверждению нулевой ширины; Я думаю, Java тоже должна, но она просто игнорирует квантификатор.

5. @Alan, да, ты мог бы просто отказаться от этого . Я обновлю ответ.