как читать строковую часть в Java - PullRequest
5 голосов
/ 14 апреля 2010

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

<meis xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" uri="localhost/naro-nei" onded="flpSW531213" identi="lemenia" id="75" lastStop="bendi" xsi:noNamespaceSchemaLocation="http://localhost/xsd/postat.xsd xsd/postat.xsd">

Как я могу получить lastStop значение свойства в JAVA?

Это регулярное выражение работало при тестировании на 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 = "<meis xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" uri=\"localhost/naro-nei\" onded=\"flpSW531213\" identi=\"lemenia\" id=\"75\" lastStop=\"bendi\" xsi:noNamespaceSchemaLocation=\"http://localhost/xsd/postat.xsd xsd/postat.xsd\">";
        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-символ в моем тесте, но у реальной строки нет выхода внутри.

UPDATE

Кто-нибудь знает, почему это не работает при использовании в Java? или как заставить это работать?

Ответы [ 2 ]

3 голосов
/ 14 апреля 2010
(?<=lastStop=[\"']?)[^\"]+
2 голосов
/ 14 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...