Последовательность подшаблона .*?(\".*?\")?('.*?')?
в конце вашего регулярного выражения может соответствовать пустой строке (все 3 части количественно определены с *
/ *?
, которые соответствуют 0 или более символам).После сопоставления example
, .*?
сначала пропускается и расширяется только тогда, когда последующие подшаблоны не совпадают.Тем не менее, они оба соответствуют пустой строке до (
, поэтому у вас есть example
в matcher0.group(0)
.
Используйте любое чередование, которое делает группу 1 обязательной ( demo ):
Pattern.compile("example.*?(\".*?\"|'.*?')"
Или вариант с закаленным жадным жетоном ( demo ), который позволяет избавиться от чередования:
Pattern.compile("example.*?(([\"'])(?:(?!\\2).)*\\2)"
Или, лучше, поддержкаэкранированные последовательности ( еще одна демонстрация ):
Pattern.compile("example.*?(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"|'[^'\\\\]*(?:\\\\.[^'\\\\]*)*')"
Во всех трех примерах вам нужен только доступ к группе 1. Если между example
и * 1028 может быть только (
* или '
, вы должны заменить .*?
на \(
, так как это сделает сопоставление более безопасным.Хотя использование регулярного выражения для сопоставления строковых литералов никогда не бывает слишком безопасным (по крайней мере, с одним регулярным выражением).