Как точно определить и работать с жадными или неохотными квантификаторами?
Дано:
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: нулевая ширина;
Нежелательный квантификатор захватывает столько, сколько позволяет, чтобы все выражение совпадало.