Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.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 - Fatal编程技术网

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

Java 使用正则表达式提取标记和标记之间的文本,java,regex,xml,Java,Regex,Xml,我正在尝试使用正则表达式提取XML标记和标记中的文本。我知道使用正则表达式不是最好的选择。我的内联文本文件中只有很少的标记,因此没有选择XML解析器 String txt="American Airlines made <TRIPS> 100 </TRIPS> flights in <DATE> December </DATE> over <ROUTE> Altantic </ROUTE> "; String re1=

我正在尝试使用正则表达式提取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
DATE
 December 
ROUTE
 Altantic

请更改为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());
            }
String txt=“美国航空公司12月份在Altantic上空进行了100次航班”;
字符串re1=“]+)>”;//标签1
字符串re2=“([^”;//标记2
字符串re3=re1;
Pattern p=Pattern.compile(re1+re2+re3,Pattern.CASE|u不区分| Pattern.DOTALL);
匹配器m=p.Matcher(txt);
while(m.find()){
字符串tag1=m.group(1);
字符串var1=m.group(2);
System.out.println(tag1.toString());
System.out.println(var1.toString());
}

如果你来这篇文章是想寻找一种解析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) );
}

使用并提取第二组。将
if(m.find())
更改为
while(m.find())
100
一样正确关闭TRIPS元素,并使用注释掉的re3版本。否则,您将无法匹配正确关闭的其他元素。(小马托尼)我希望你能意识到你在做什么。你正在编写一个应用程序,如果它是以一种非常特殊的方式编写的,那么它只会处理XML。因此,人们会问你如何用这种非常特殊的词汇形式生成XML,你将成为一打这样的问题的原因,因为消费应用程序只有用这种方式编写才能工作当然,标准是有原因的,这种滥用标准的行为会导致行业内的每个人都要承担更高的成本。
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) );
}