我正在尝试使用正则表达式在标记中提取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
答案 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) );
}