Причина, по которой это не работает так, как вы ожидаете, заключается в *
в [^\"']*
. Вид сзади совпадает в позиции перед в "
в lastStop="
, что разрешено, поскольку кавычка необязательна: [\"']?
. Предполагается, что следующая часть соответствует нулю или большему количеству символов без кавычек, но поскольку следующий символ равен кавычке, он соответствует нулевым символам.
Если вы измените это *
на +
, вторая часть не будет соответствовать в этой позиции, что заставит двигатель регулярного выражения двигаться вперед еще на одну позицию. Вид сзади будет соответствовать кавычке, а [^\"']+
будет соответствовать следующему. Тем не менее, вы действительно не должны использовать для этого взгляд назад. Гораздо проще просто сопоставить всю последовательность обычным способом и извлечь часть, которую вы хотите сохранить, через группу захвата:
String sampleRegex = "lastStop=[\"']?([^\"']*)";
Pattern p = Pattern.compile(sampleRegex);
Matcher m = p.matcher(sampleText);
if (m.find()) {
String matchedText = m.group(1);
System.out.println("matched [" + matchedText + "]");
} else {
System.out.println("didn’t match");
}
Это также облегчит решение упомянутой проблемы @Kobi. Вы пытаетесь разрешить значения, содержащиеся в двойных, одинарных или без кавычек, но ваше регулярное выражение слишком упрощено. Во-первых, значение в кавычках может содержать пробел, а не в кавычках - нет. Чтобы справиться со всеми тремя возможностями, вам потребуется две или три группы захвата, а не одна.