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