как считать строковую часть в Java

У меня есть эта строка:


Как я могу добраться 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? или как заставить его работать?

5
задан Joachim Sauer 14 April 2010 в 10:37
поделиться

2 ответа

(?<=lastStop=[\"']?)[^\"]+
3
ответ дан 14 December 2019 в 19:07
поделиться

Причина, по которой это не работает так, как вы ожидали, заключается в * в [^ \ "'] * . Поиск назад соответствует позиции перед ] " в 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. Вы пытаетесь разрешить значения, содержащиеся в двойном- кавычки, одинарные кавычки или отсутствие кавычек, но ваше регулярное выражение слишком упрощено. С одной стороны, значение в кавычках может содержать пробелы, а значение без кавычек - нет.Чтобы иметь дело со всеми тремя возможностями, вам понадобятся две или три группы захвата, а не одна.

2
ответ дан 14 December 2019 в 19:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: