我有一个句子(用空格分隔的词)。
然后我有两个短语列表(完整或部分单词,即不包含空格):一个是“包含”列表,另一个是“排除”列表。
匹配的句子将包含“包括”列表中的所有短语(重叠可以,大小写不敏感),而“排除”列表中没有一个短语。
如何检验句子是否符合规则?谢谢。
示例
句子= This yammy Flybe catalog is sticky
包含list = cat fly tic
排除列表= veg pot yam
测试失败是因为,尽管所有的“包括”短语都在句子中,但其中一个“排除”短语(yam)确实出现了。将单词yammy改为yummy,测试就会通过。
P.S.目前在SQL中使用关系除法实现,当SQL数据库中的数据很好的时候,这似乎是很好的优化。现在我有一个来自外部源的数据结构。我想我可以传入分隔字符串,拆分成表行,等等,但是我想研究其他选项。所以如果不是regex,那又怎样?
发布于 2009-12-10 12:23:28
虽然我认为这与正则表达式不是一件好事,但当正则表达式是您选择的技术时,您可以考虑一些类似的东西(消极的向前看和正面的向前看,锚定在开头):
^(?=.*include1)(?=.*include2)(?=.*...)(?!.*(?:exclude1|exclude2|...))在将单个句子添加到包含表达式或排除表达式之前,请确保对它们使用Regex.Escape。regex的工作方式如下:
如果
include2在匹配字符串中,则失败;如果include2在匹配字符串中,则失败;如果includeX位于匹配字符串中,则成功;如果includeX位于匹配字符串中,则失败;如果H 211H 112H 112如果exclude1在匹配字符串中,则失败;如果H 214/代码>H 115如果exclude2在匹配字符串中,则失败;如果H217/code>H 118如果excludeX在字符串中,则代码失败,代码<220><<<221>代码>><221>>代码><220代码><<221>代码><换句话说:所有包括的句子都必须(按任何顺序排列),所有排除的句子都必须退出。
注意:这种类型的正则表达式,即使在编译时,也不是由.NET正则表达式引擎很好地优化的。如果包含/排除的列表变得很大,那么简单的级联例程可能已经非常昂贵。最后,选择(一个接一个地匹配单个句子)可能更慢。要找出答案,请衡量这两种方法的性能。
更新:修正了代码中的错误并添加了解释。
https://stackoverflow.com/questions/1880570
复制相似问题