使用正则表达式在标记之间提取标记和文本

时间:2016-10-17 04:50:14

标签: java regex xml

我正在尝试使用正则表达式在标记中提取XML标记和文本。我知道使用正则表达式不是最好的选择。我的内联文本文件中只有很少的标签,因此没有选择XML解析器。

 String txt="American Airlines made <TRIPS> 100 </TRIPS> flights in <DATE> December </DATE> over <ROUTE> Altantic </ROUTE> ";

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


    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);

        System.out.println(tag1.toString());
        System.out.println(var1.toString());
     }

问题是,它只识别第一个标签而不是第二个标签或后续标签。

当前输出

TRIPS
 100

期望输出

TRIPS
 100
DATE
 December 
ROUTE
 Altantic

2 个答案:

答案 0 :(得分:1)

请更改if while:

String txt = "American Airlines made <TRIPS> 100 <TRIPS> flights in <DATE> December </DATE> over <ROUTE> Altantic </ROUTE> ";

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

            Pattern p = Pattern.compile(re1 + re2 + re3, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
            Matcher m = p.matcher(txt);
            while (m.find()) {
                String tag1 = m.group(1);
                String var1 = m.group(2);

                System.out.println(tag1.toString());
                System.out.println(var1.toString());
            }

答案 1 :(得分:1)

如果您来这篇文章寻找解析XML的方法,请不要阅读此内容。改为使用XML解析器。

<强>解决方案:

if (m.find())更改为while (m.find())。您可以迭代查找所有匹配项。

这是查找所有正则表达式匹配的一般情况:

Pattern p = Pattern.compile(regex,flags);
Matcher m = p.matcher(text);
while (m.find())
{
    System.out.println("First group: " + m.group(1) + 
                       "\nSecond group: " + m.group(2) );
}