如何在java中读取字符串部分

时间:2010-04-14 08:54:05

标签: java regex

我有这个字符串:

<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">

如何在JAVA中获取lastStop属性值?

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 char,但是真正的字符串里面没有escape。 ?

更新

有没有人知道为什么这在java中使用时不起作用?或者如何使它发挥作用?

2 个答案:

答案 0 :(得分:3)

(?<=lastStop=[\"']?)[^\"]+

答案 1 :(得分:2)

它无法正常工作的原因是因为*中的[^\"']*。 lookbehind在{em> {/ 1}}之前的位置匹配,这是允许的,因为引用是可选的:"。下一部分应该匹配零个或多个非引号字符,但因为下一个字符一个引号,它匹配零个字符。

如果您将lastStop="更改为[\"']?,则第二部分将无法在该位置匹配,从而迫使正则表达式引擎再向前突出一个位置。 lookbehind将匹配引号,*将匹配以下内容。但是,你真的不应该首先使用lookbehind。以正常方式匹配整个序列并通过捕获组提取您想要保留的部分要容易得多:

+

它还可以更容易地解决@Kobi提到的问题。您试图允许包含在双引号,单引号或无引号中的值,但您的正则表达式过于简单。首先,引用的值可以包含空格,但是不带引号的值不能。要处理所有这三种可能性,您需要两个或三个捕获组,而不仅仅是一个。