Вопрос по regex – Регулярное выражение Java о поиске строки цифр

2

Я изучал в Интернете учебник по регулярным выражениям Java и запутался в одной маленькой программе.

  // String to be scanned to find the pattern.
  String line = "This order was places for QT3000! OK?";
  String pattern = "(.*)(\\d+)(.*)";

  // Create a Pattern object
  Pattern r = Pattern.compile(pattern);

  // Now create matcher object.
  Matcher m = r.matcher(line);
  if (m.find( )) {
     System.out.println("Found value: " + m.group(0) );
     System.out.println("Found value: " + m.group(1) );
     System.out.println("Found value: " + m.group(2) );
  } 

И результаты распечатаны:

Found value: This order was places for QT3000! OK?

Found value: This order was places for QT300

Found value: 0

Я понятия не имею, почему группа (1) получает значение выше значения? Почему он останавливается перед последним нулем «QT3000»?

Большое спасибо!

Регулярные выражения Java .. это звучит ужасно gaussblurinc
ноль, который вы пропускаете в группе 1, прямо там, в группе 2 ... группа 3 будет! OK?. cha0site

Ваш Ответ

2   ответа
0

Группа 0 всегда будет всей строкой, чтобы соответствовать

Группа 1 будет соответствовать (. *), Которая называется «жадная». потому что он будет соответствовать как можно большему количеству символов (в вашем случае & quot; этот порядок был размещен для QT300 & quot;)

Группа 2 - это совпадение для (\ d +), которое является минимально возможным для соответствия регулярному выражению (в вашем случае это «0»).

Группа 3 (которую вы не печатали) является последней (. *) И должна соответствовать & quot ;! ОК & Quot; («?» - это специальный символ регулярного выражения, если вы хотите сопоставить его с буквальным префиксом \)

Если вы хотите сопоставить 3000 в группе 2, используйте это регулярное выражение:

String pattern = "(.*?)(\\d+)(.*)";
Да, шаблон, который вы указали для сопоставления "3000" работал. И теперь я понимаю использование «?»? также. Спасибо! D.Q.
2

(.*) (это индекс 1 - индекс 0 - общее регулярное выражение) - жадное совпадение. Он захватывает столько, сколько может, при этом общее выражение все равно совпадает. Таким образом, это может занять до второго0 в строке, оставляя только0 соответствовать(\\d+), Если вам нужно другое поведение, то вам следует прочитать жадные и не жадные совпадения или найти более подходящий шаблон.

Да я вижу. Это очень полезно. Большое спасибо! D.Q.

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