有没有一种方便的方法来编写一个试图匹配尽可能多的正则表达式的正则表达式?
例:
my $re = qr/a ([a-z]+) (\d+)/;
match_longest($re, "a") => ()
match_longest($re, "a word") => ("word")
match_longest($re, "a word 123") => ("word", "123")
match_longest($re, "a 123") => ()
Run Code Online (Sandbox Code Playgroud)
也就是说,$re被认为是一系列正则表达式,并match_longest试图匹配这个序列的多少.从某种意义上说,匹配永远不会失败 - 这只是一个匹配成功的问题.一旦正则表达式匹配失败,undef对于不匹配的部分.
我知道我可以编写一个函数,它接受一系列正则表达式并创建一个单一的正则表达式来完成工作match_longest.以下是该想法的概述:
假设你有三个正则表达式:$r1,$r2和$r3.执行该作业的单个正则表达式match_longest将具有以下结构:
$r = ($r1 $r2 $r3)? | $r1 ($r2 $r3) | $r1 $r2 $r3?
Run Code Online (Sandbox Code Playgroud)
不幸的是,这是正则数的二次方.是否可能更有效率?
你可以使用正则表达式
$r = ($r1 ($r2 ($r3)?)?)?
Run Code Online (Sandbox Code Playgroud)
每个正则表达式只包含一次.(?:...)在此示例中,您还可以使用非捕获组来不干扰原始正则表达式.