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)
我想它与如何否定有关,而不是字符类([^`']但是多字符串.
(?:(?!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.