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

Java正则表达式捕获太多

Java正则表达式捕获太多,java,regex,xml,tags,Java,Regex,Xml,Tags,我正在尝试实现一个简单的正则表达式,它允许我在XML中捕获一些信息 然而,我的正则表达式捕获了几个标记,并给出了一个很长的答案。例如,如果我有类似于: <item> <title>bla</title> ... <description>bla</description> </item> <item> <title>bla2</title> .... <description>

我正在尝试实现一个简单的正则表达式,它允许我在XML中捕获一些信息

然而,我的正则表达式捕获了几个标记,并给出了一个很长的答案。例如,如果我有类似于:

<item>
<title>bla</title>
...
<description>bla</description>
</item>
<item>
<title>bla2</title>
....
<description>bla2, keyword here are blablabla</description>
</item>

布拉
...
布拉
废话
....
bla2,关键字这里是blabla
但是,我使用的正则表达式如下:

<item><title>([\\p{L}\\p{N}\\W \\.\\,]*?)</title>.*?<description>[\\p{L}\\p{N} \\.\\,]keyword[\\p{L}\\p{N} \\.\\,]*</description>
([\\p{L}\\p{N}\\W\\.\,]*?).*?[\\p{L}\\p{N}\\.\,]关键字[\\p{L}\\p{N}\\.\,]*
标题和描述之间有标签。当我使用这个正则表达式时,它会给我所有的标签,直到它第一次找到单词“关键字”。所以,问题是这一行:

</title>.*?<description>
*?
我如何告诉我的正则表达式,如果它找到的第一个描述标记没有关键字,它应该选择下一个标记并从第二个item标记返回结果。或者,如果title标记和description标记之间存在结束项标记,则不应查找这两个标记之间的所有数据

我希望我能解释清楚。如果需要,请要求澄清

编辑:

另一种解决方案:

 <item><title>([\\p{L}\\p{N}\\W \\.\\,]*?)</title>(?:(?!<item>).)*?<description>[\\p{L}\\p{N} \\.\\,]keyword[\\p{L}\\p{N} \\.\\,]*</description>
([\\p{L}\\p{N}\\W\\\.\,]*?)(?:(?!)*?[\\p{L}\\p{N}\.\,]关键字[\\p{L}\\p{N}\.\,]*
使用(?:(?!)*作为负前瞻,以避免捕获新项目中的字符串。

这个正则表达式怎么样

(<item>[^<]*?<title>(?<title>[^<]*?)<\/title>([^<]|<(?!description))*<description>(?<desc>[^<]*?keyword[^<]*?)<\/description>[^<]*?<\/item>)

([^为什么要用正则表达式解析XML?使用XML解析器不是更省钱吗?为正确的工作使用正确的工具?这不是个人的选择。这是一个学术练习。我面临着一个难题…我是否应该链接到这个问题?你有一个学术练习,告诉你必须使用一个工具(正则表达式)对于一份不适合的工作来说?我不太明白。无论如何,如果有一个正则表达式满足了你的需求,它肯定不会是“简单的”这就是你所说的你想要的。是的,目的是使用正则表达式从RSSs获取数据。在这个特定的练习中,我需要通过描述标签中的关键字过滤新闻。我很快就能找到答案……是的,这是可能的。但是练习需要使用正则表达式来找到匹配的关键字,所以,我不能使用它。@juanprejecty是否要匹配?“查找匹配的关键字”-不知道就无法找到关键字。您的意思是“查找描述包含关键字的项目或项目标题”?我事先知道关键字,所以是的,我需要返回描述中包含关键字的新名称。@我已经更新了正则表达式/我的答案。请检查它是否适合您的需要。不幸的是,它不适合。正如我之前所评论的,“…”在文本上表示其他几个标记。我将您用于进行我自己的一些测试的正则表达式分叉,这是我当前的问题:正则表达式选择整个文本,而不仅仅是第二个item标记之间的文本。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Module1{
  public static void main(String[] asd){
      String sourcestring = "source string to match with pattern";
      Pattern re = Pattern.compile("(<item>[^<]*?<title>(?<title>[^<]*?)<\\/title>([^<]|<(?!description))*<description>(?<desc>[^<]*?keyword[^<]*?)<\\/description>[^<]*?<\\/item>)",Pattern.DOTALL);
      Matcher m = re.matcher(sourcestring);
      int mIdx = 0;
      while (m.find()){ 
          for( int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++ ){
            System.out.println( "[" + mIdx + "][" + groupIdx + "] = " +    m.group(groupIdx));
      }
      mIdx++;
    }
  }
}