Как точно определить и работать с жадными или неохотными квантификаторами?

Дано:

import java.util.regex.*;

class Regex2 {    
  public static void main (String args[]) {
    Pattern p = Pattern.compile(args[0]);
    Matcher m = p.matcher (args [1]);    
    boolean b = false;

    while (m. find()) {
       System.out.print(m.start()  + m.group());
    }
  }
}

выражение командной строки:

java Regex2 "\d*" ab34ef

Что в итоге?

A. 234
B. 334
C. 2334
D 0123456
E. 01234456
F. 12334567
G. Compilation fails

Книга SCJP объясняет регулярные выражения, шаблоны и соответствия так ужасно, что это невероятно. В любом случае, я в значительной степени понимаю большинство основ и посмотрел документацию Sun/Oracle о жадных и неохотных квантификаторах. Я понимаю концепции, но размыты о нескольких вещах:

Что именно является физическим символом "жадного" квантификатора? Это просто один *,? или +? Если да, то может ли кто-нибудь объяснить подробно, как этот ответ оказался E согласно книге? Когда я запускаю его сам, я получаю ответ: 2334!

Здесь мы будем использовать жадный квантификатор правильно? Это будет занимать всю строку, а затем возвращаться назад и искать ноль или более цифр подряд. Таким образом, если он будет жадным, "полная строка" будет содержать 2 цифры в строке и будет выполнять.find() только один раз (т. Е. M.start = 0, m.group = "ab34ef"), по этому определению!

Спасибо за помощь, ребята!

1 ответ

Это спички \d* против "ab34ef":

  • индекс 0: нулевая ширина;
  • индекс 1: нулевая ширина;
  • индекс 2: "34";
  • индекс 4: нулевая ширина;
  • индекс 5: нулевая ширина;
  • индекс 6: нулевая ширина.

Это должно объяснить ваш вывод. Если бы квантификатор был неохотным, это было бы разницей:

  • индекс 2: нулевая ширина;
  • индекс 3: нулевая ширина;

Нежелательный квантификатор захватывает столько, сколько позволяет, чтобы все выражение совпадало.

Другие вопросы по тегам