4

抱歉标题混乱,我想不出正确的措辞。我试图了解正则表达式是否可以匹配不同的字符串,具体取决于是否捕获了先前的捕获组。

/th?u(e|r)sday/

这匹配tuesdaythursday但也thuesdaytursday。有没有办法在正则表达式中表明一个部分应该只匹配,如果前一个部分匹配......所以我想象一个潜在的语法,比如......捕获组中的数字(?#:pattern)在哪里#,如果捕获组捕获,则包含模式,否则跳过。(!#:pattern)如果#未捕获第 组,则类似的模式。这种发明的语法是为了展示我正在尝试做的事情。使用这种发明的语法,我可以像这样解决上面的问题......

/t(h)?u(!1:e)(?1:r)sday/

正则表达式中是否有任何这样的语法来实现这种类型的引用?

4

2 回答 2

4

此功能确实存在于某些正则表达式实现中,并且您示例中的正则表达式将这样编写:

/t(h)?u(?(1)r|e)sday/

显然这不是最好的例子,因为/t(hur|ue)sday/它是等价的而且更短,但在某些情况下它更有用。

查看此高级正则表达式参考页面表格中的倒数第二个元素,此处提供有关条件的更多信息。

  • 句法:

    (?(1)then|else)
    
  • 描述:

    如果到目前为止第一个捕获组参与了匹配尝试,则“then”部分必须匹配整个正则表达式才能匹配。如果第一个捕获组没有参与匹配,则“else”部分必须匹配整个正则表达式才能匹配。

  • 例子:

    (a)?(?(1)b|c)匹配ab,第一个c和第二个cbabxcac

根据同一页面,条件语句由JGsoft 引擎PerlPCRE.NET 框架支持。

于 2013-02-21T22:32:56.280 回答
1

为什么不直接使用更具体的析取呢?

/t(hur|ue)sday/
于 2013-02-21T22:25:49.940 回答