如何递归匹配与多字符分隔符平衡的字符串?

n.r*_*.r. 2 regex recursion perl

如何递归匹配与多字符分隔符平衡的字符串?

考虑一个LaTeX内联引号,这样2个doubleticks(``)标记引号开始的位置,2个撇号(\x27\x27)标记结束.

以下代码给了我``five''.我想抓住two ``three `four' ``five'' three four'' six

my $str = q|one ``two ``three `four' ``five'' three four'' six'' seven|;

if ( $str =~ /
              (
              ``
                (?:
                     [^`']
                       |
                     (?1)
                )*
              ''
              )
            /x
   )
   {
     print "$1\n";
   }
Run Code Online (Sandbox Code Playgroud)

我想它与如何否定有关,而不是字符类([^`']但是多字符串.

ike*_*ami 6

(?:(?!PAT)(?s:.))*PAT[^CHAR]*CHAR,那么

(?:(?!``|'')(?s:.))*
Run Code Online (Sandbox Code Playgroud)

匹配任何不是这两个序列开头的字符.但是,我认为前瞻一点都不贵,所以我相信

(?: [^`']+ | `(?!`) | '(?!') )*
Run Code Online (Sandbox Code Playgroud)

会更便宜.我们得到以下内容:

/
   (
      ``
         (
            (?: [^`']+ | `(?!`) | '(?!') )*
            (?:
               (?-2)
               (?: [^`']+ | `(?!`) | '(?!') )*
            )*
         )
      ''
   )
/x
Run Code Online (Sandbox Code Playgroud)

我们可以简化性能下降.

/
   (
      ``
         (
            (?: [^`']+
            |   `(?!`)
            |   '(?!')
            |   (?-2)
            )*
         )
      ''
   )
/x
Run Code Online (Sandbox Code Playgroud)

在两个片段中,您要捕获的文本都在$2.