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

1 regex language-agnostic vbscript

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

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

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

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

例子

句子 = This yammy Flybe catalog is sticky

包括列表 = cat fly tic

排除列表 = veg pot yam

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

PS目前为此使用SQL中的关系划分实现,当SQL数据库中的数据领先时,这似乎得到了很好的优化。现在我有一个来自外部来源的数据结构。我想我可以传入分隔的字符串,拆分为表格行等,但我想研究其他选项。那么,如果不是正则表达式,那又如何?

Abe*_*bel 5

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

^(?=.*include1)(?=.*include2)(?=.*...)(?!.*(?:exclude1|exclude2|...))
Run Code Online (Sandbox Code Playgroud)

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

  • 如果include1在匹配字符串中,则成功,如果不在,则失败并
  • 如果include2在匹配字符串中,则成功,如果不在,则失败并
  • 如果includeX在匹配字符串中,则成功,如果不在,则失败并
  • 如果exclude1在匹配的字符串中,则失败或
  • 如果exclude2在匹配的字符串中,则失败或
  • 如果excludeX在匹配字符串中,则失败。

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

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

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