我正在尝试有效地匹配行,但不包括可选的结束令牌。
/(.*)(?:$tok)?/
不起作用。结束令牌是可选的,因此是最后一个?,但随后第一个组贪婪地捕获了它。
/(.*?)(?:$tok)?/
也不起作用:第一组匹配零长度的字符串
到目前为止,我能做的最好的事情是
my $tok = 'end';
while (<>) {
my ($line) = /
(?| # 'branch reset'
(.*)$tok # either a line terminated with the end token
| # or
(.*) # the whole line
) # end branch reset group
/x;
print $line, "\n";
}
这行得通,但令我感到效率低下。正则表达式引擎必须将行解析两次,这是我试图避免的事情。
我知道使用index()可以更好地解决上述问题:
my $i = index($_, $end);
$line = $i < 0 ? $_ : substr $_, 0, $i;
但是我需要对行进行其他处理以使正则表达式令人满意-无论如何,我认为这是一个学习的机会;-)
请看下面的例子。在这里,它great
在匹配项的末尾或line($
)的末尾寻找单词。
my $str = 'alexander the great alex';
if ($str =~ m/(.*?)(?=great|$)/i) {
print "$1";
}
您可以取代你$token
用great
上面的例子。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句