我正在使用以下正则表达式,但正如您所看到的,表达式中有很多递归 有没有更好的方法来解决这个问题? 我需要的是一种“跳跃”操作符。
((letzter|voriger|letztes|voriges) (lied|title|song))( (höhren|abspielen))?|((lied|title|song)( (wiederholen|erneut (höhren|abspielen))))
答案 0 :(得分:1)
PCRE实施subroutine calls,以实现完全您需要的内容。
(?P<groupname>subpattern)
定义了一个群组。\g<groupname>
致电该小组。<强>正则表达式:强>
/
(?:(?P<relative>letzte[rs]|vorige[rs])[ ])? # optional non-capturing group
(?P<what>lied|title|song)
(?(relative) # IF group <relative> was matched
(?:[ ](?P<action>höhren|abspielen))? # another optional non-capturing group
|
[ ](wiederholen|erneut[ ]\g<action>) # subroutine call to group <action>
)
/ix
PCRE允许一些方法来定义一个组,所有这些方法具有相同的含义:
(regex)
群组(?P<name>regex>
名为 name 的小组。(?'name'regex)
名为 name 的小组。(?<name>regex)
名为 name 的小组。以及进行子程序调用的不同方法:
(?3)
递归/致电小组3。\g<3>
递归/致电小组3。\g'3'
递归/致电小组3。(?-1)
递归/呼叫前一组。\g<-1>
递归/呼叫前一组。\g'-1'
递归/呼叫前一组。\g<-1>
递归/呼叫前一组。(?&name)
递归/呼叫名为 name 的小组。(?P>name)
递归/呼叫名为 name 的小组。\g<name>
递归/呼叫名为 name 的小组。\g'name'
递归/呼叫名为 name 的小组。