在标记之间提取的Java模式正则表达式
我正在尝试为RSS提要设计自定义XML阅读器。下面是我在测试中的JAVA代码:在标记之间提取的Java模式正则表达式,java,regex,xml,pattern-matching,Java,Regex,Xml,Pattern Matching,我正在尝试为RSS提要设计自定义XML阅读器。下面是我在测试中的JAVA代码: Pattern pattern = Pattern.compile("<(item)(.*?)>((.*))</\\1>", Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher("<item value=\"key\" atr='none'><title val=\"has value\">Good
Pattern pattern = Pattern.compile("<(item)(.*?)>((.*))</\\1>", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("<item value=\"key\" atr='none'><title val=\"has value\">Good</title><link>www</link></item>"
+ "<item value=\"key\" atr='none'><title val=\"has value\">Bad</title><link>http</link></item>"
+ "<item value=\"key\" atr='none'><title val=\"has value\">Neutral</title><link>ftp</link></item>");
while (matcher.find()) {
for (int i = 0; i < matcher.groupCount(); i++) {
System.out.println("\n" + i + ":" + matcher.group(i));
}}
Pattern=Pattern.compile((.*),Pattern.CASE不区分大小写);
Matcher Matcher=pattern.Matcher(“Goodwww”
+“Badhttp”
+“中立的”;
while(matcher.find()){
对于(int i=0;i0:<item value="key" atr='none'><title val="has value">Good</title><link>www</link></item><item value="key" atr='none'><title val="has value">Bad</title><link>http</link></item><item value="key" atr='none'><title val="has value">Neutral</title><link>ftp</link></item>
1:item
2: value="key" atr='none'
3:<title val="has value">Good</title><link>www</link></item><item value="key" atr='none'><title val="has value">Bad</title><link>http</link></item><item value="key" atr='none'><title val="has value">Neutral</title><link>ftp</link>
0:goodwwbdhatttpneutralftp
1:项目
2:value=“key”atr='none'
3:GoodwwwBadhttpNeutralftp
期望输出:
<title val="has value">Good</title><link>www</link>
<title val="has value">Bad</title><link>http</link>
<title val="has value">Neutral</title><link>ftp</link>
Goodwww
Badhttp
中微子
基本上,我希望循环运行的时间与源字符串中出现的item标记的数量相同。目前,regex中的第三个组正在提取字符串,直到最后一个与第一个组匹配的结束标记,情况应该不是这样。第三组应包含字符串,直到与第一组的相应结束标记匹配为止
编辑:
根据@11thdimension的建议,我正在添加我需要的更多信息:
您应该使用Lucero建议的XML解析器 然而,如果您必须使用正则表达式,那么您可以使用以下命令
<title.*?<\/link>
为什么不使用现有的XML解析器呢?Regex不是完成这项工作的合适工具…@Lucero我试过了,但它们非常慢,需要太多的开销。据我所知,JAVA没有任何内置XML解析器。我们必须依靠外部资源。此外,XML结构可能因源而异。如果发生这种情况,那么用不同的标记名为不同的XML结构编码就不那么可靠了。因此,我根据自己的需要设计了一个简单的XML解析器,可以读取多种结构。我不是说我发展得最好,但它最适合我。我想你错了。第一个XML支持已经与Java捆绑在一起很长一段时间了(另请参见)。第二个XML解析器完全独立于结构,只要输入是有效的XML,这与基于正则表达式的解析器形成了很大的对比。第三,如果您想比较顺序解析性能,不要将XML读入DOM表示,而是使用读取器。至于您的正则表达式实现,永远不要在类似这样的情况下使用没有惰性限定符的*
,您总是会自食其果。请注意,
可能与您希望它匹配的内容不匹配,除非添加DOTALL
标志。但这并没有改变使用regex进行标记化以外的基本缺陷;它不能处理递归和对,因此在读取结构化数据时,在某些时候它总是会使您失败。您的解决方案很好,但也有一些例外。首先,如果对结构进行操纵,例如ftpany title,它将不会给出期望的结果。第二,如果链接标签之后的项目标签中有其他标签,它将不会抓取它们。2月12日的任何时候,它都将跳过日期。只要您只对
和
感兴趣,它将给出所需的结果。您认为它不会,那么请在问题@11thdimension中添加特殊情况,我已根据您的建议添加了一些更多信息。谢谢,我已根据您的建议添加了更多信息。谢谢
<item.*?>(.*?)<\/item>
public class TestRegex {
public static void main(String[] args) {
String str = "<item value=\"key\" atr='none'><date><date><title val=\"has value\">Good</title><link>www</link></item><item value=\"key\" atr='none'><title val=\"has value\">Bad</title><link>http</link><author></author></item><item value=\"key\" atr='none'><title val=\"has value\">Neutral</title><link>ftp</link></item>";
Pattern pattern = Pattern.compile("<item.*?>(.*?)<\\/item>");
Matcher match = pattern.matcher(str);
while(match.find()) {
System.out.println(match.group(1));
}
}
}
<date><date><title val="has value">Good</title><link>www</link>
<title val="has value">Bad</title><link>http</link><author></author>
<title val="has value">Neutral</title><link>ftp</link>