У меня есть эта строка:
Как я могу добраться lastStop
значение свойства в JAVA?
Этот regex работал при тестировании на http://www.myregexp.com/
Но когда я пробую его в Java, я не вижу подобранный текст, вот то, как я попробовал:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class SimpleRegexTest {
public static void main(String[] args) {
String sampleText = "";
String sampleRegex = "(?<=lastStop=[\"']?)[^\"']*";
Pattern p = Pattern.compile(sampleRegex);
Matcher m = p.matcher(sampleText);
if (m.find()) {
String matchedText = m.group();
System.out.println("matched [" + matchedText + "]");
} else {
System.out.println("didn’t match");
}
}
}
Возможно, проблема состоит в том, что я использую символ Escape в своем тесте, но реальная строка не имеет Escape внутри.?
ОБНОВЛЕНИЕ
Кто-либо знает, почему это не работает при использовании в Java? или как заставить его работать?
Причина, по которой это не работает так, как вы ожидали, заключается в *
в [^ \ "'] *
. Поиск назад соответствует позиции перед ] "
в 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. Вы пытаетесь разрешить значения, содержащиеся в двойном- кавычки, одинарные кавычки или отсутствие кавычек, но ваше регулярное выражение слишком упрощено. С одной стороны, значение в кавычках может содержать пробелы, а значение без кавычек - нет.Чтобы иметь дело со всеми тремя возможностями, вам понадобятся две или три группы захвата, а не одна.