正则表达式双方面组件

时间:2013-02-21 22:21:49

标签: regex

对于令人困惑的标题感到抱歉,我想不出正确的措辞。我试图了解正则表达式是否有办法匹配不同的字符串,具体取决于是否捕获了先前的捕获组。

/th?u(e|r)sday/

这与tuesdaythursday以及thuesdaytursday相匹配。有没有办法在正则表达式中指出一个部分应该只匹配,如果前一个部分匹配...所以我想象一个潜在的语法,如... (?#:pattern)其中#是一个数字来自捕获组,如果捕获组被捕获,则包含模式,否则跳过它。如果未捕获(!#:pattern)组,则类似模式#。这个发明的语法是为了演示我想要做的事情。有了这个发明的语法,我可以像上面这样解决我的问题...

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

在regex中是否有任何这样的语法来实现这种类型的引用?

2 个答案:

答案 0 :(得分:4)

在某些正则表达式实现中确实存在此功能,您示例中的正则表达式将按如下方式编写:

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

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

查看this advanced regex reference page表格中的倒数第二个元素,并提供有关条件here的其他信息。

  • 语法:

    (?(1)then|else)
    
  • 说明

      

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

  • 示例:

    (a)?(?(1)b|c)匹配abc中的第一个c和第二个babxcac

根据同一页面,JGsoft enginePerlPCRE.NET framework支持条件。

答案 1 :(得分:1)

为什么不使用更具体的分离?

/t(hur|ue)sday/