Как работает 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 идет?
Итерации по циклу шесть раз... Как?
Любое предложение?
Ответы
Ответ 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 или более.