我正在尝试编写一个正则表达式来识别单行文本,并将下划线(_)识别为行继续符.例如,"foo_ \nbar"应该被视为一行,因为"foo"以下划线结尾.我在尝试:
$txt = "foo_\nbar";
print "$&\n" if $txt =~ /.*(_\n.*)*/;
Run Code Online (Sandbox Code Playgroud)
但是,这仅打印:
foo_
Run Code Online (Sandbox Code Playgroud)
这似乎违反了Perl正则表达式中"最左边最长"的规则!
有趣的是,如果我删除正则表达式中的最后一个星(*),即:
$txt = "foo_\nbar";
print "$&\n" if $txt =~ /.*(_\n.*)/;
Run Code Online (Sandbox Code Playgroud)
它不打印:
foo_
bar
Run Code Online (Sandbox Code Playgroud)
但我需要这位明星认出"0或更多"的延续!
我究竟做错了什么?
Perl不做"最左边"; 相反,每个正则表达式功能都有明确定义的行为方式.只要正则表达式的其余部分完全匹配,您的初始*将尽可能多地匹配.为防止它吞咽_,请执行以下操作:
/(.*(?!(?<=_)\n)_\n)*.*/
Run Code Online (Sandbox Code Playgroud)