我有一个句子(用空格分隔的单词)。
然后我有两个短语列表(完整或部分单词,即不包含空格):一个是'包含'列表,另一个是'排除'列表。
匹配句子将包含“包含”列表中的所有短语(重叠是正常的,不区分大小写的),并且不包含“排除”列表中的短语。
如何测试句子是否符合规则?感谢。
实施例
句子= This yammy Flybe catalog is sticky
包含列表= cat
fly
tic
排除列表= veg
pot
yam
测试失败,因为虽然所有“包含”短语都在句子中,但其中一个“排除”短语(yam
)确实出现了。将单词yammy
更改为yummy
,测试应该通过。
P.S。目前在SQL中使用关系分区实现,当SQL数据库中的数据很明显时,这似乎很好地优化了。现在我有一个来自外部源的数据结构。我想我可以传入分隔的字符串,拆分成表格行等,但我想调查其他选项。那么如果不是正则表达式那么呢?
答案 0 :(得分:4)
虽然我认为这对正则表达式来说不是一件好事,但是当正则表达式是你选择的技术时,你可以考虑这些方面的东西(负面的前瞻和积极的前瞻,锚定在开头):
^(?=.*include1)(?=.*include2)(?=.*...)(?!.*(?:exclude1|exclude2|...))
确保在单个句子上使用Regex.Escape
,然后在include或exclude表达式中添加它们。正则表达式的工作原理如下:
include1
,则成功,否则失败,include2
,则成功,否则失败,includeX
,则成功,否则失败,exclude1
位于匹配的字符串中,则会失败或exclude2
位于匹配的字符串中,则会失败或excludeX
在匹配的字符串中,则会失败。换句话说:所有包含句子必须在(以任何顺序),所有排除句子都必须出来。
注意:即使在编译时,这种类型的正则表达式也没有被.NET正则表达式引擎很好地优化。如果包含/排除列表变大,则简单连接例程可能已经非常昂贵。最后,替代方案(逐个匹配单个句子)可能更慢。要找出答案,请衡量两种方法的表现。
更新: 修复了代码中的错误并添加了解释。