【问题标题】:Java REGEX Capturing too muchJava REGEX 捕获太多
【发布时间】:2026-02-16 03:05:01
【问题描述】:

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

但是,我的 REGEX 捕获了几个标签并给了我一个很长的答案。例如,如果我有类似的东西:

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

但是,我使用如下的正则表达式:

<item><title>([\\p{L}\\p{N}\\W \\.\\,]*?)</title>.*?<description>[\\p{L}\\p{N} \\.\\,]keyword[\\p{L}\\p{N} \\.\\,]*</description>

标题和描述之间有标签。当我使用该正则表达式时,它会为我提供所有标签,直到它第一次找到“关键字”这个词。所以,问题出在这一行:

</title>.*?<description>

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

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

编辑:

另一种解决方案:

 <item><title>([\\p{L}\\p{N}\\W \\.\\,]*?)</title>(?:(?!<item>).)*?<description>[\\p{L}\\p{N} \\.\\,]keyword[\\p{L}\\p{N} \\.\\,]*</description>

使用 (?:(?!).)* 作为负前瞻以避免在新项目中捕获字符串。

【问题讨论】:

  • 为什么要用正则表达式解析 XML?使用 XML 解析器不是更省钱吗?为正确的工作使用正确的工具?
  • 这不是个人选择。这是为了学术练习。
  • 我正面临两难境地...我应该链接到那个问题吗?
  • 你有一个学术练习告诉你必须在不适合的工作中使用工具(正则表达式)?不确定我是否理解。无论如何,如果有一个正则表达式可以满足您的需求,那么它肯定不会是您所说的“简单”。
  • 是的,目的是使用 REGEX 从 RSS 获取数据。在这个特定的练习中,我需要通过描述标签中的关键字过滤新闻。我已经很接近找到答案了……

标签: java regex xml tags


【解决方案1】:

这个正则表达式呢?

(<item>[^<]*?<title>(?<title>[^<]*?)<\/title>([^<]|<(?!description))*<description>(?<desc>[^<]*?keyword[^<]*?)<\/description>[^<]*?<\/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++;
    }
  }
}

您可以在此处找到示例数据的结果:https://regex101.com/r/gA3nR4/4

【讨论】:

  • 是的,这是可能的。但是这个练习需要使用正则表达式来查找匹配的关键字,所以我不能使用它。
  • @JuanPReyes 你到底想匹配什么? “找到匹配的关键字”——你在不知道的情况下找不到关键字。您的意思是“查找描述中包含关键字的项目或项目标题”吗?
  • 我事先知道关键字,所以是的,我需要返回描述中包含关键字的新标题。
  • @JuanPReyes 我已经更新了正则表达式/我的答案。请检查它是否符合您的需求。
  • 不幸的是,它没有。正如我之前评论的那样,文本上的“...”代表了其他几个标签。我分叉了你用来做我自己的一些测试的正则表达式,这是我当前的问题:regex101.com/r/gA3nR4/1 正则表达式选择整个文本而不是第二个项目标签之间的文本。