带有“包含”列表和“排除”列表的正则表达式

时间:2009-12-10 12:11:20

标签: regex language-agnostic vbscript

我有一个句子(用空格分隔的单词)。

然后我有两个短语列表(完整或部分单词,即不包含空格):一个是'包含'列表,另一个是'排除'列表。

匹配句子将包含“包含”列表中的所有短语(重叠是正常的,不区分大小写的),并且不包含“排除”列表中的短语。

如何测试句子是否符合规则?感谢。

实施例

句子= This yammy Flybe catalog is sticky

包含列表= cat fly tic

排除列表= veg pot yam

测试失败,因为虽然所有“包含”短语都在句子中,但其中一个“排除”短语(yam)确实出现了。将单词yammy更改为yummy,测试应该通过。

P.S。目前在SQL中使用关系分区实现,当SQL数据库中的数据很明显时,这似乎很好地优化了。现在我有一个来自外部源的数据结构。我想我可以传入分隔的字符串,拆分成表格行等,但我想调查其他选项。那么如果不是正则表达式那么呢?

1 个答案:

答案 0 :(得分:4)

虽然我认为这对正则表达式来说不是一件好事,但是当正则表达式是你选择的技术时,你可以考虑这些方面的东西(负面的前瞻和积极的前瞻,锚定在开头):

^(?=.*include1)(?=.*include2)(?=.*...)(?!.*(?:exclude1|exclude2|...))

确保在单个句子上使用Regex.Escape,然后在include或exclude表达式中添加它们。正则表达式的工作原理如下:

  • 如果匹配字符串中有include1,则成功,否则失败,
  • 如果匹配字符串中有include2,则成功,否则失败,
  • 如果匹配字符串中有includeX,则成功,否则失败,
  • 如果exclude1位于匹配的字符串中,则会失败或
  • 如果exclude2位于匹配的字符串中,则会失败或
  • 如果excludeX在匹配的字符串中,则会失败。

换句话说:所有包含句子必须在(以任何顺序),所有排除句子都必须出来。

注意:即使在编译时,这种类型的正则表达式也没有被.NET正则表达式引擎很好地优化。如果包含/排除列表变大,则简单连接例程可能已经非常昂贵。最后,替代方案(逐个匹配单个句子)可能更慢。要找出答案,请衡量两种方法的表现。

更新: 修复了代码中的错误并添加了解释。