【问题标题】:Regex lookahead more than one element正则表达式前瞻多个元素
【发布时间】:2013-01-11 14:25:55
【问题描述】:

当一个或多个字符没有立即遵循前瞻断言时,是否可以使用前瞻来确定这些字符是否存在/不存在?

例如
给定与此类似的正则表达式:

([abc])([def])([ghi])

如果第一组中有“a”,我是否可以只允许第三组中的“i”作为匹配项?

【问题讨论】:

  • 在我看来,您真正想要的是向后看,而不是向前看。你在使用 pcre/perl RE 吗?
  • 我正在使用 JavaScript,但我只是出于好奇而询问(我目前并没有尝试解决它的问题)。使用 JavaScript,lookbehinds 是不可能的,但我觉得可以通过lookbehind 完成的任何事情也可以通过lookahead 完成。
  • 这就是为什么正则表达式标签的常见问题解答说你总是应该为你正在使用正则表达式的语言添加一个标签:) 不,你绝对不能做任何事后能做的事与前瞻。除非您在您的正则表达式中有lookbehinds - 那么您可以反转字符串 正则表达式以将lookbehinds 转换为lookaheads。
  • 对不起;添加了“javascript”标签。是的——我肯定忽略了一些向后看的东西。谢谢。

标签: javascript regex regex-lookarounds


【解决方案1】:

您可以使用lookbehind 断言(除非您的目标是正则表达式引擎不支持的JavaScript):

([abc])([def])([gh]|(?<=a.)i)

【讨论】:

  • 啊——是“。”这很重要,对吧?假设 ([def]) 是可选的——它可以通过捕获组来解决吗?
  • @davidpmccormick:同样,这取决于正则表达式引擎。 Lookbehinds(如果存在)在某些情况下是固定长度的,在大多数情况下是有限长度的,在少数正则表达式中是不定长度的。因此,在 PHP 中,您可以使用 ([abc])([def])?([gh]|(?&lt;=a.?)i),但在 Python 中则不行。
  • 谢谢,蒂姆。我会给你荣誉,但我虚弱的名声不允许这样做。不过,请考虑一下自己的功劳。
【解决方案2】:

如果您想使用 OR 操作,请使用 | 像这样

(asd)|(zxc)|(qwe)

【讨论】:

    【解决方案3】:

    您可以使用条件模式。

    试试这个:

    /((a)|(b|c))([def])(?(2)i|[gh])/
    

    (用 PCRE 测试)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2016-12-08
      • 2011-10-14
      • 2010-12-17
      相关资源
      最近更新 更多