我有一个搜索词列表,我想要一个正则表达式来匹配至少有两个搜索词的所有项目。
术语:战争|军队|战斗|叛军|冲突
匹配war在。。之间rebels和army导致了几个clashes本星期。 (4 次点击)
不匹配:在war在恐怖主义方面,奥巴马政府希望增加无人机袭击的次数。 (仅命中 1 次)
背景:我使用微小的 rss 来收集和过滤新闻报道项目的大量提要。我每天收到 1000 - 2000 个 Feed 项目,并且想按关键字过滤它们。通过仅使用 |OR 表达式,我会得到许多误报,因此我认为我可以只要求提要项目中的两个匹配项。
Thanks!
EDIT:
我对正则表达式知之甚少,所以到目前为止我坚持使用简单的 |OR 运算符。我尝试将搜索词放在括号中 (war|fighting|etc){2,},但仅当某个项目使用相同单词两次时才匹配。
EDIT2:很抱歉造成混乱,我是正则表达式等方面的新手。事实是:正则表达式查询 mysql 数据库。它作为过滤器输入到 tt-rss 后端,仅允许一行(尽管理论上字符数不受限制)。在将提要项目导入 mysql 数据库时使用过滤器。
(.*?\b(war|army|fighting|rebels|clashes)\b){2,}
如果需要避免匹配相同的术语,可以使用:
.*?\b(war|army|fighting|rebels|clashes).*?(\b(?!\1)(war|army|fighting|rebels|clashes)\b)
它匹配一个术语,但通过使用负向前瞻避免再次匹配相同的术语。
In java:
Pattern multiword = Pattern.compile(
".*?(\\b(war|army|fighting|rebels|clashes)\\b)" +
".*?(\\b(?!\\1)(war|army|fighting|rebels|clashes)\\b)"
);
Matcher m;
for(String str : Arrays.asList(
"war",
"war war war",
"warm farmy people",
"In the war on terror rebels eating faces"
)) {
m = multiword.matcher(str);
if(m.find()) {
logger.info(str + " : " + m.group(0));
} else {
logger.info(str + " : no match.");
}
}
Prints:
war : no match.
war war war : no match.
warm farmy people : no match.
In the war on terror rebels eating faces : In the war on terror rebels
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)