复杂的正则表达式捕获特定单词而不是部分单词

时间:2016-06-30 19:39:13

标签: regex

我遇到了一个匹配给定单词的所有实例但与partials不匹配的正则表达式。我正在扫描的文本将是原始HTML。

这是我现在的正则表达式:

/(|>|^|;|,| )(detroit|to|christmas|holiday|test|his)(<| |\.|;|,|\!|\?|\)|$)/i

正则表达式将与粗体字匹配:

  

请务必查看Agile以获取最新版本的适用服务和   安装程序!此数据库中包含的步骤适用于   仅限故障排除,而不是执行服务。这不是一个   受控文件,可能不会分发非Stryker   人员

     

圣诞节假期圣诞节圣诞节假期底特律   圣诞节假期

如果我将正则表达式修改为:

/(|>|^|;|,| )?(detroit|to|christmas|holiday|test|his)(<| |\.|;|,|\!|\?|\)|$)/i

正则表达式匹配以下内容:

  

请务必检查敏捷是否有适用的服务和安装程序的la 测试版本! t 他的数据库中包含的步骤仅用于故障排除,而不用于执行服务。 T 他的不是受控文件,可能不会分发 非Stryker人员

     

圣诞假期圣诞假期底特律 圣诞假期

第二个版本匹配它应该的所有单词但由于?修饰符它也匹配我想跳过的部分。如何修改正则表达式,以便“圣诞节”的匹配不会使下一个可能的匹配空间变得粗糙?

4 个答案:

答案 0 :(得分:0)

使用字边界\b,我认为您希望每行匹配多个组(最后g):

/\b(detroit|to|christmas|holiday|test|his)\b/gi

https://regex101.com/r/xJ5xW6/1

答案 1 :(得分:0)

您还没有说过您正在使用的正则表达式引擎,而是您所需要的标准方法,例如: Perl,如果引擎有它,则是零宽度字边界说明符\b

/(|>|^|;|,| )?\b(detroit|to|christmas|holiday|test|his)\b(<| |\.|;|,|\!|\?|\)|$)/i

对于你的第二个问题,保持引擎免于消费的标准方法是&#34;文字是使用&#34; lookahead&#34;匹配(?=...),这需要前瞻性regexp,但不消耗它(因此可用于后续匹配):

/(|>|^|;|,| )\b(detroit|to|christmas|holiday|test|his)\b(?=<| |\.|;|,|\!|\?|\)|$)/i

答案 2 :(得分:0)

使用字边界\b

/\b(detroit|to|christmas|holiday|test|his)\b/gi

检查出来:https://regex101.com/r/sJ3jM2/1

答案 3 :(得分:0)

我认为这就是你要找的东西:

/\b(detroit|to|christmas|holiday|test|his)+\b/gi