嵌套模式的正则表达式

时间:2019-06-29 04:42:47

标签: php regex

我有一个这样的模式:

#alphanumericX(anythingY){
    anythingZ
}#

它可以像这样嵌套:

#alphanumeric1(anything1){
    #alphanumericX(anythingY){
        anythingZ
    }#
}#

或者这样:

#alphanumeric1(anything1){
    anything2
    #alphanumericX(anythingY){
        anythingZ
    }#
}#

模式不仅可以写一次,而且可以这样写:

#alphanumericX(anythingY){
    anythingZ
}#
#alphanumeric1(anything1){
    anything1
}#

我想要一个正则表达式匹配上面的模式,所以它将返回如下:

#alphanumericX(anythingY){
    anythingZ
}#

如何实现?

这是我当前的正则表达式:/#(.*?)\((.*?)\)\{(.*?)\}#/sm

1 个答案:

答案 0 :(得分:3)

要知道何时匹配递归输入,最重要的标记是(?R)(递归整个模式)或(?1),其中?之后的数字表示要递归的子模式

在这里,您可以使用

#\w+\(\w+\){(?:(?R)|.)*?}#

https://regex101.com/r/iMUAZM/1

  • #\w+\(\w+\)-匹配#,单词字符,(,单词字符和)
  • {-比赛开始括号
  • (?:(?R)|.)*?重复匹配
    • (?R)还是整个模式,或者
    • .-任何字符,直到
  • }#-模式的结尾