Проблема с регулярным выражением SCJP6

У меня проблема со следующим примером:

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(b = m.find()) {
            System.out.print(m.start() + m.group());
        }
    }
}

И командная строка:

java Regex2 "\d*" ab34ef

Может кто-нибудь объяснить мне, почему результат: 01234456

шаблон регулярного выражения - d * - это означает номер один или несколько, но есть больше позиций, которые в args [1],

Благодарность


person Karlo    schedule 22.08.2013    source источник
comment
Нет, * означает ноль или больше. + означает один или несколько.   -  person Chris Jester-Young    schedule 22.08.2013


Ответы (1)


\d* соответствует 0 или более цифрам. Таким образом, он будет даже соответствовать пустой строке перед каждым символом и после последнего символа. Сначала перед индексом 0, затем перед индексом 1 и так далее.

Итак, для строки ab34ef она соответствует следующим группам:

Index    Group
  0        ""  (Before a)
  1        ""  (Before b)
  2        34  (Matches more than 0 digits this time)
  4        ""  (Before `e` at index 4)
  5        ""  (Before f)
  6        ""  (At the end, after f)

Если вы используете \\d+, вы получите только одну группу в 34.

person Rohit Jain    schedule 22.08.2013
comment
Есть ли в результате что-то с положением символов или это индексы результатов символов или? - person Karlo; 22.08.2013
comment
@ Карло. Результат - это индекс символа, перед которым сопоставлена ​​пустая строка. - person Rohit Jain; 22.08.2013
comment
@RohitJain, как может случиться так, что индекс if 0 относится к Before a, а индекс 2 находится в 34? если 0 стоит перед, то разве это не будет индекс 3, который находится в 34? Сканер находится в одном положении и смотрит в положение слева от него? Сканер находится в положении перед? - person sdc; 29.09.2016