Подтвердить что ты не робот

Как работает Matcher.find()

Я тестирую небольшую заглушку класса Matcher и Pattern... см. следующий небольшой заглушка.

package scjp2.escape.sequence.examples;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Sample_19 {

    public static void main(String a[]){
        String stream = "ab34ef";
        Pattern pattern = Pattern.compile("\\d*");

        //HERE * IS GREEDY QUANTIFIER THAT LOOKS FOR ZERO TO MANY COMBINATION THAT 
        //START WITH NUMBER 
        Matcher matcher = pattern.matcher(stream);

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

}

Здесь... наша строка, которую мы сравниваем, - "ab34ef". которая имеет длину 6.

Noe позволяет видеть итерацию...


Итерация NO matcher.start() matcher.group()

1 0 ""

2 1 ""

3 2 34

4 4 ""

5 5 ""

Теперь.. комбайт... matcher.start() + matcher.group().... выход по нашему расчёту: 0123445

Но, заглушка генерирует 01234456.

Я не могу понять, откуда идет "6". Индекс строк начинается с нуля, и поэтому здесь может быть максимальный индекс 5.So от того, где 6 идет?

Итерации по циклу шесть раз... Как? Любое предложение?

4b9b3361

Ответ 1

Ваше регулярное выражение может соответствовать нулевым символам. Конечное совпадение - это строка с нулевой шириной, встречающаяся в конце строки, после символа в индексе 5. Таким образом, индекс этой строки ширины 0.


Как и в стороне, вам также может быть легче понять, что происходит, если вы используете разделители, чтобы сделать вывод более читаемым:

System.out.println(matcher.start()+ ": " + matcher.group());

Результаты:

0: 
1: 
2: 34
4: 
5: 
6: 

ideone

Ответ 2

Ваше выражение использует *, что означает 0 или более цифр, поэтому также не может совпадать с цифрой.

Измените свое регулярное выражение таким образом

Pattern pattern = Pattern.compile("\\d+");

Использование + означает 1 или более.