使用带有XML标记的字符串上的正则表达式在标记之间提取标记和文本

时间:2016-10-14 09:53:27

标签: java regex xml

我正在尝试在文本文件中提取标记和文本之间的文本。我试图使用正则表达式实现这一点(没有很多xml标签)。

下面是我到目前为止所尝试的

     String txt="<DATE>December</DATE>";

        String re1="(<[^>]+>)"; // Tag 1
        String re2="(.*?)"; // Variable Name 1
        String re3="(<[^>]+>)"; // Tag 2

        Pattern p = Pattern.compile(re1+re2+re3,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
        Matcher m = p.matcher(txt);
        if (m.find())
        {
            String tag1=m.group(1);
            String var1=m.group(2);
            String tag2=m.group(3);
            //System.out.print("("+tag1.toString()+")"+"("+var1.toString()+")"+"("+tag2.toString()+")"+"\n");

            System.out.println(tag1.toString().replaceAll("<>", ""));
            System.out.println(var1.toString());
        }

作为答案,我得到:

<DATE>
December

如何摆脱<>

2 个答案:

答案 0 :(得分:2)

不要使用正则表达式来解析标记语法,例如XML,HTML,XHTML等。

Many reasons are shown here.

相反,请帮自己一个忙,并使用XPathXQuery

答案 1 :(得分:1)

使用正则表达式解析xml是个坏主意。使用正则表达式无法识别从开始标记到结束标记的完整元素(正则表达式不能“记住”多次出现)。

然而,为什么你的正则表达式在这种特殊情况下失败了:

re1re2re3中,您选择要包含<>的捕获组(同样不包括/re3)。你可以简单地改变这个

String re1="<([^>]+)>"; // Tag 1
String re2="([^<]*)"; // Variable Name 1
String re3="</([^>]+)>"; // Tag 2

或使用合适的正则表达式删除<>形式tag1

System.out.println(tag1.toString().replaceAll("<|>", ""));

System.out.println(tag1.toString().replaceAll("[<>]", ""));