PCRE regular expressions using named pattern subroutines

前端 未结 1 1087
半阙折子戏
半阙折子戏 2020-12-16 06:26

I am experimenting with the named subpattern/\'subroutine\' regex features in PHP\'s PCRE and I\'m hoping someone can explain the following strange output:

$         


        
相关标签:
1条回答
  • 2020-12-16 07:14

    It makes perfect sense these subpatterns would not capture a group - their main purpose it to be used more than once, so you can't really capture them all. In addition, if the default was to capture all subpatterns it wouldn't give you an option not to capture a group where you don't want it - not the best default behavior. The opposite is trivial - you can capture by adding another group around the (?&a) statement.
    I couldn't find a reference to this on PCRE.org. The closest is this, which is relevant because you don't match (?<a>...) directly (though you might expect an empty group):

    Any capturing parentheses that are set during the subroutine call revert to their previous values afterwards.

    It is clearer on the Perl manual (relevant part highlighted):

    An example of how this might be used is as follows:

    /(?<NAME>(?&NAME_PAT))(?<ADDR>(?&ADDRESS_PAT))
    (?(DEFINE)
    (?<NAME_PAT>....)
    (?<ADRESS_PAT>....)
    )/x
    

    Note that capture buffers matched inside of recursion are not accessible after the recursion returns, so the extra layer of capturing buffers is necessary.

    0 讨论(0)
提交回复
热议问题