对于令人困惑的标题感到抱歉,我想不出正确的措辞。我试图了解正则表达式是否有办法匹配不同的字符串,具体取决于是否捕获了先前的捕获组。
/th?u(e|r)sday/
这与tuesday
,thursday
以及thuesday
和tursday
相匹配。有没有办法在正则表达式中指出一个部分应该只匹配,如果前一个部分匹配...所以我想象一个潜在的语法,如... (?#:pattern)
其中#
是一个数字来自捕获组,如果捕获组被捕获,则包含模式,否则跳过它。如果未捕获(!#:pattern)
组,则类似模式#
。这个发明的语法是为了演示我想要做的事情。有了这个发明的语法,我可以像上面这样解决我的问题...
/t(h)?u(!1:e)(?1:r)sday/
在regex中是否有任何这样的语法来实现这种类型的引用?
答案 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)
匹配ab
,c
中的第一个c
和第二个babxcac
根据同一页面,JGsoft engine,Perl,PCRE和.NET framework支持条件。
答案 1 :(得分:1)
为什么不使用更具体的分离?
/t(hur|ue)sday/