【问题标题】:REGEX: Select KeyWord1 if KeyWord2 is in the same string正则表达式:如果 KeyWord2 在同一个字符串中,则选择 KeyWord1
【发布时间】:2020-05-16 03:46:51
【问题描述】:

我正在尝试根据字符串中是否存在 KeyWord2 在 .NET 正则表达式引擎 中捕获 KEYWORD1。到目前为止,我正在使用的积极的环顾解决方案:

(?=.*KeyWord2)**KEYWORD1** (\m\i)

RegEx Test Link

仅当 KeyWord2 位于字符串中 KEYWORD1 后面的任何位置时才捕获 KEYWORD1。如何在正则表达式中优化它,以便它捕获字符串中 KEYWORD1 的所有实例,尽管 KeyWord2 的位置在前面、后面或两者兼而有之?

我真的很感激一些见解。

谢谢

【问题讨论】:

  • 亲爱的 Mandy8055 感谢您的关注。如果您单击通过 rubular.com 提供的 RegEx 测试链接,您会注意到失败的案例。谢谢
  • 亲爱的 Mandy8055 非常感谢您的贡献。您的解决方案解决了这个难题,它在 .NET 正则表达式引擎中完美运行。
  • 你可以使用:(?=.*KeyWord2).*(KEYWORD1) 那么'KEYWORD1'将永远在group1中。
  • @Mandy8055,是的,你是对的,我的答案被错误地发布在错误的问题上。我删了它。我很惊讶有人投了反对票(更新:2 票反对),而它显然不是针对这个问题的。
  • @CarySwoveland 我很难过为什么人们这么早就因为任何错误而投反对票。应该以某种方式避免这种情况

标签: regex positive-lookahead


【解决方案1】:

您可以使用下面的正则表达式来满足您的要求:

\bKEYWORD1\b(?:(?<=\bKeyWord2\b.*?)|(?=.*?\bKeyWord2\b))

上面正则表达式的解释:

gi - 使用标志(为了避免任何大小写差异)表示: g - 全局; i - 不区分大小写

\b - 表示单词边界。

(?:) - 表示非捕获组。

(?=.*?KeyWord2) - 表示与 KeyWord2 之前的所有 KEYWORD1 匹配的 正向预测 strong> 从左到右阅读。

| - 代表交替;也就是说,它在 1st2nd 交替组之间交替。(尽管您可以将它们包装在组中。)

(? - 表示无限(因为使用了非固定宽度惰性标识符.*?正向后视 > 匹配 KeyWord2 后面的所有 KEYWORD1

你可以找到上面的正则表达式演示here.

注意 - 郑重声明,这些引擎支持无限后视

据我所知,他们是唯一的。

【讨论】:

  • 也可以缩写为KEYWORD1(?:(?&lt;=Keyword2.*?)|(?=.*?Keyword2))。也许是更好的选择。
  • @CarySwoveland 匹配;请添加-i 标志并检查一次。 Here 是样本运行。如果还有其他问题,请告诉我
  • 优秀的答案!很有启发性。 (是的,我忘记了大小写无关标志,或者换一种说法,我写的是"Keyword2"而不是"KeyWord2"。)
  • 一个小点:你真的不需要答案中的“编辑:”。如果您分发了一篇论文的草稿,获得了有用的建议并将一些建议纳入修订,您将不会包含“编辑:”,因为您将尝试编写对读者最有用的文本,而不是讲述一个故事你是如何得到答案的。我认为这同样适用于 SO 答案。换句话说,为什么要强调编辑?我个人使用 cmets 表示感谢和致谢,有时还用于报告我之前写的内容。同样,这是为了让答案集中在回答问题上。
  • @revo,不错!
【解决方案2】:

如果使用支持\G\K 的正则表达式引擎,则可以使用以下正则表达式。

^(?=.*\bKeyWord2\b)|\G.*?\K\bKEYWORD1\b

使用大小写无关标志,并根据要求设置多行标志。

PCRE demo

使用 PCRE (PHP) 和其他一些正则表达式引擎,锚点 \G 匹配上一个匹配的结尾。对于第一次匹配尝试,\G 等价于\A,匹配字符串的开头。详情请见this discussion

\K 将报告匹配的起点重置为引擎内部字符串指针的当前位置。任何先前使用的字符都不包含在最终匹配中。实际上,\K 导致引擎“忘记”与该点匹配的所有内容。详情可见here

如链接所示,字符串有四个匹配项

The KEYWORD1 before KeyWord2 then KEYWORD1 and KEYWORD1 again

它们是字符串开头的空字符串以及KEYWORD1 的三个实例中的每一个。事实上,对于每个匹配的字符串,其中一个匹配项将是字符串开头的空字符串。因此,在进行替换时必须忽略空字符串。

【讨论】:

    猜你喜欢
    • 2019-08-17
    • 2021-05-16
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多