我想要一个正则表达式来查找两个字符之间的字符串,但只能从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"
之前和/>
答案 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
答案 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);