从正则表达式中删除重复

时间:2015-10-10 22:54:45

标签: regex pcre

我正在使用以下正则表达式,但正如您所看到的,表达式中有很多递归 有没有更好的方法来解决这个问题? 我需要的是一种“跳跃”操作符。

((letzter|voriger|letztes|voriges) (lied|title|song))( (höhren|abspielen))?|((lied|title|song)( (wiederholen|erneut (höhren|abspielen))))

Regular expression visualization

Debuggex Demo

1 个答案:

答案 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

Regular expression visualization

Debuggex Demo

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 的小组。