用于在两个字符之间查找字符串的正则表达式模式 - 但第一次出现第二个字符

时间:2017-01-25 14:16:18

标签: java regex string

我想要一个正则表达式来查找两个字符之间的字符串,但只能从start delimiter到第一次出现的end delimiter

我想从以下格式的行中提取故事

<metadata name="user" story="{some_text_here}" \/>

所以我只想提取:{some_text_here}

为此我使用以下正则表达式:

<metadata name="user" story="(.*)" \/>

和java代码:

public static void main(String[] args) throws IOException {
        String regexString = "<metadata name="user" story="(.*)" \/>";
        String filePath = "C:\\Desktop\\temp\\test.txt";
        Pattern p = Pattern.compile(regexString);
        Matcher m;
        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                m = p.matcher(line);
                if (m.find()) {                     
                    System.out.println(m.group(1));
                }
            }
        }

    }

这个正则表达式大部分工作正常但令人惊讶的是如果该行是:

<metadata name="user" story="My name is Nick" extraStory="something" />

运行代码也会过滤My name is Nick" extraStory="something 在哪里我只想确保得到My name is Nick

另外,我想确保story="My name is Nick"之前和/>

之前没有任何信息

3 个答案:

答案 0 :(得分:1)

<metadata name="user" story="([^"]*)" \/>

[^“] *将匹配除”。“之外的所有内容。在这种情况下,字符串

<metadata name="user" story="My name is Nick" extraStory="something" />

将无法匹配。

答案 1 :(得分:1)

以下XPath应该可以解决您的问题:

//metadata[@name='user' and @story and count(@*) = 2]/@story

它解决了story属性为metadata的文档中任何name节点的user属性,该属性也具有story属性但没有其他属性(属性计数为2)。

(注意://metadata[@name='user' and count(@*)=2]/@story就足够了,因为无法解决第二个属性不是story的{​​{1}}节点的metadata属性

在Java代码中,假设您正在处理story的实例且已有org.w3c.dom.Document实例,则代码如下:

XPath

您可以尝试XPath here或Java代码here

答案 2 :(得分:0)

只需使用Jsoup即可。正确的问题工具:)。

这很容易:

String html; //read html file

Document document = Jsoup.parse(html);

String story = document.select("metadata[name=user]").attr("story");

System.out.println(story);