Подводя итог,
1) Два шаблона дают разные результаты из-за правил приоритета операторов.
(?:Yes|No)(.*)End
совпадений (да или
Нет) с последующим. * Конец
(?:Yes)|(?:No)(.*)End
совпадений (да)
или (Нет, а затем. * Конец)
2) Второй шаблон дает число групп 1, но начало и конец -1 из-за (не обязательно интуитивного) значения результатов, возвращаемых вызовами метода Matcher
.
Matcher.find()
возвращает true, если совпадение найдено. В вашем случае совпадение было на (?:Yes)
части шаблона.
Matcher.groupCount()
возвращает количество групп захвата в шаблоне независимо от того, действительно ли группы захвата участвовали в матче . В вашем случае в матче участвовала только не захватывающая часть шаблона (?:Yes)
, но группа захвата (.*)
все еще была частью шаблона, поэтому количество групп равно 1.
Matcher.start(n)
и Matcher.end(n)
возвращают начальный и конечный индексы подпоследовательности, совпадающей с n -й группой захвата. В вашем случае, хотя общее совпадение было найдено, группа захвата (.*)
не участвовала в совпадении и поэтому не захватила подпоследовательность, следовательно, результат -1.
3) (Вопрос задан в комментарии.) Чтобы определить, сколько групп захвата фактически захватило подпоследовательность, выполните итерацию Matcher.start(n)
от 0 до Matcher.groupCount()
, считая количество результатов, отличных от -1. (Обратите внимание, что Matcher.start(0)
- это группа захвата, представляющая весь шаблон, который вы, возможно, захотите исключить для своих целей.)