Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在标记之间提取的Java模式正则表达式_Java_Regex_Xml_Pattern Matching - Fatal编程技术网

在标记之间提取的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

我正在尝试为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</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;i 以下是输出:

0:<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的建议,我正在添加我需要的更多信息:

  • XML结构还可以在项目标记中包含其他标记,如日期、作者等。代码还应使用title和link标记检索这些标记
  • 标记的层次结构不是固定的。它们可以是任意顺序:标题、链接、日期或链接、标题、日期或日期、链接、标题等

  • 您应该使用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>