Java 用于查找两个字符之间的字符串的正则表达式模式-但第二个字符的第一次出现
我需要一个正则表达式来查找两个字符之间的字符串,但只能从开始分隔符到结束分隔符的第一个匹配项 我想从以下格式的行中提取故事Java 用于查找两个字符之间的字符串的正则表达式模式-但第二个字符的第一次出现,java,regex,string,Java,Regex,String,我需要一个正则表达式来查找两个字符之间的字符串,但只能从开始分隔符到结束分隔符的第一个匹配项 我想从以下格式的行中提取故事 <metadata name="user" story="{some_text_here}" \/> 和java代码: public static void main(String[] args) throws IOException { String regexString = "<metadata name="user" story=
<metadata name="user" story="{some_text_here}" \/>
和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));
}
}
}
}
publicstaticvoidmain(字符串[]args)引发IOException{
字符串regexString=“”;
String filePath=“C:\\Desktop\\temp\\test.txt”;
Pattern p=Pattern.compile(regexString);
匹配器m;
try(BufferedReader br=new BufferedReader(new FileReader(filePath))){
弦线;
而((line=br.readLine())!=null){
m=p.matcher(直线);
如果(m.find()){
系统输出println(m.group(1));
}
}
}
}
这个正则表达式大部分工作正常,但如果行是:
<metadata name="user" story="My name is Nick" extraStory="something" />
运行代码也会过滤我的名字是Nick“extraStory=”something
因为我只想确保我得到了我的名字是Nick
此外,我还想确保在使用之前和使用之前,在story=“My name is Nick”
之间实际上没有任何信息。解决此问题的正确工具:)
<metadata name="user" story="([^"]*)" \/>
这很简单:
String html; //read html file
Document document = Jsoup.parse(html);
String story = document.select("metadata[name=user]").attr("story");
System.out.println(story);
就用吧。解决此问题的正确工具:)
这很简单:
String html; //read html file
Document document = Jsoup.parse(html);
String story = document.select("metadata[name=user]").attr("story");
System.out.println(story);
以下XPath应该可以解决您的问题:
//metadata[@name='user' and @story and count(@*) = 2]/@story
它处理文档中名称
属性为用户
的任何元数据
节点的故事
属性,该节点也有一个故事
属性,但没有其他属性(属性计数为2)
(注意://元数据[@name='user'和count(@*)=2]/@story
就足够了,因为不可能解决第二个属性不是story
的元数据
节点的story
属性)
在Java代码中,假设您正在处理一个org.w3c.dom.Document
的实例,并且已经有一个XPath
的实例可用,代码如下:
xPath.evaluate("//metadata[@name='user' and @story and count(@*) = 2]/@story", xmlDoc);
您可以尝试XPath或Java代码。以下XPath应该可以解决您的问题:
//metadata[@name='user' and @story and count(@*) = 2]/@story
它处理文档中名称
属性为用户
的任何元数据
节点的故事
属性,该节点也有一个故事
属性,但没有其他属性(属性计数为2)
(注意://元数据[@name='user'和count(@*)=2]/@story
就足够了,因为不可能解决第二个属性不是story
的元数据
节点的story
属性)
在Java代码中,假设您正在处理一个org.w3c.dom.Document
的实例,并且已经有一个XPath
的实例可用,代码如下:
xPath.evaluate("//metadata[@name='user' and @story and count(@*) = 2]/@story", xmlDoc);
您可以尝试XPath或Java代码。。您想使量词不贪婪,或排除结尾字符。您需要的是上下文感知解析器,而正则表达式不是。
(?您真的,真的,真的应该为此使用解析器。但是鉴于正则表达式的特殊性,您可以将
更改为[^]
:。您想使量词不贪婪,或排除结尾字符。您需要的是上下文感知解析器,而regex不是。(?您真的,真的,真的应该为此使用解析器。但是考虑到regex的特殊性,您可以将
更改为[^]
:我不确定它是否是正确的工具,我认为这太过分了1)如果源是格式良好的XML数据,2)用户还不熟悉CSS/jquery选择器查询。但它不会读取包含无效attr的字符串,即包含extraStory的行。所以这对我来说也是一个限制,那就是这一行除了名字和故事之外不应该包含任何内容tag@Aaron可能会稍微慢一点,但它的简单值得。一行代码。你什么都得不到simpler@NickDiv它只提取“故事”属性中的数据。没有别的了,伙计。这就是为什么它是这项工作的正确工具。:)@nafas的XPath应该是//metadata[@name=“user”]/@story
,它比您的dom操作稍小,因为它包含属性选择。Jsoup非常适合解析格式错误的HTML,因为它允许通过流行的CSS选择器查询访问dom。如果你不需要这两种功能中的任何一种,我只是不认为它是解决问题的正确工具我不确定它是否是正确的工具,我认为这太过分了1)如果源是格式良好的XML数据,2)用户还不熟悉CSS/jquery选择器查询。但是它不会读取一个包含无效attr的字符串,也就是一行包含extraStory。所以这对我来说也是一个限制,那就是这一行除了名字和故事之外不应该包含任何内容tag@Aaron可能会稍微慢一点,但它的简单值得。一行代码。你什么都得不到simpler@NickDiv它只提取“故事”属性中的数据。没有别的了,伙计。这就是为什么它是这项工作的正确工具。:)@nafas的XPath应该是//metadata[@name=“user”]/@story
,它比您的dom操作稍小,因为它包含属性选择。Jsoup非常适合解析格式错误的HTML,因为它允许通过流行的CSS选择器查询访问dom。如果你不需要这两种功能中的任何一种,我就不会把它称为解决这个问题的正确工具,“extraStory”只是一个例子。对不起,我不清楚。如果它包含除“name”和“story”之外的任何内容,则无效,因此“extraStory”标记将使该行无效,“extraStory1”将使其无效,“xyz”也将使其无效。@NickDiv我已更新XPath表达式,以确保只有两个属性na