我试图实现一个简单的REGEX,它允许我在XML中捕获一些信息。
然而,我的REGEX捕获了几个标签并给了我很长的答案。例如,如果我有类似的东西:
<item>
<title>bla</title>
...
<description>bla</description>
</item>
<item>
<title>bla2</title>
....
<description>bla2, keyword here are blablabla</description>
</item>
但是,我使用REGEX,如:
<item><title>([\\p{L}\\p{N}\\W \\.\\,]*?)</title>.*?<description>[\\p{L}\\p{N} \\.\\,]keyword[\\p{L}\\p{N} \\.\\,]*</description>
标题和说明之间有标签。当我使用那个REGEX时,它会给我所有标签,直到它第一次找到单词&#34; keyword&#34;。所以,问题是这一行:
</title>.*?<description>
如何告诉我的REGEX如果找到的第一个描述标记没有关键字,则应选择下一个标记并从第二个标记返回结果。或者,如果在这两者之间有一个结束项标记,它不应该查找标题标记和描述标记之间的所有数据。
我希望我能清楚地解释自己。如果需要,请要求澄清。
修改
另一种解决方案:
<item><title>([\\p{L}\\p{N}\\W \\.\\,]*?)</title>(?:(?!<item>).)*?<description>[\\p{L}\\p{N} \\.\\,]keyword[\\p{L}\\p{N} \\.\\,]*</description>
使用(?:( ?!)。)*作为负向前瞻,以避免在新项目中捕获字符串。
答案 0 :(得分: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