【问题标题】:Regex match these words, but exclude matches with these正则表达式匹配这些词,但排除与这些词的匹配
【发布时间】:2014-08-17 12:46:36
【问题描述】:

我正在寻找一个正则表达式来遍历多个字符串并匹配其中的这些单词:

Maces Armour Evasion Shields

排除包含这些单词的字符串:

Swords Axes Staves

例如(这两行是一个字符串):

12% Increased Physical Damage with Maces
8% Increased Armour

应该是匹配的,但这个不应该是(这两行也是一个字符串,但它包含禁用词“swords”和需要的词“evasion”):

10% Increased Evasion
8% Increased Attack Speed with Swords

如何排除该列表?

【问题讨论】:

  • 为什么10% Increased Evasion不匹配?
  • @user3218114 这两行是一个完整的字符串
  • 这个应用程序是用 C# 编写的,它不是我的,但它接受正则表达式。我已经尝试过 (maces|armour|evasion|shields) 之类的东西,它显示匹配的字符串,但也有剑和其他东西,这就是我想排除这些的原因。

标签: c# .net regex


【解决方案1】:

您可以对需要的单词使用前瞻,对禁用的单词使用否定前瞻(如果您的正则表达式引擎允许这两个功能):

(?s)(?=.*\b(?:Maces|Armour|Evasion|Shields)\b)(?!.*\b(?:Swords|Axes|Staves)\b)^.+$

【讨论】:

  • @Unihedron:即使你把锚放在开头也无法避免回溯,它没有任何改变。
  • @Unihedron:这里不需要原子团,因为原子团不包含任何量词,或者如果您设置了这种词:abcd|abc|defgh|def。不过,你的方法也行得通。
  • 好的,没关系,我不知道这个程序接受什么正则表达式,但看起来它与你的答案有某种关系。谢谢:P
【解决方案2】:

您可以使用singleline 正则表达式:

/^(?=.*(?>Maces|Armour|Evasion|Shields))(?!.*(?>Swords|Axes|Staves)).+$/s
  • (?=.*(?>Maces|Armour|Evasion|Shields)) 断言其中一个词出现在字符串 [no backtracking]
  • (?!.*(?>Swords|Axes|Staves)) 断言这些词都不存在于字符串 [无回溯]

这是regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    相关资源
    最近更新 更多