这是否违反了"最左边最长"的原则?

Joe*_*Fan 3 regex perl

我正在尝试编写一个正则表达式来识别单行文本,并将下划线(_)识别为行继续符.例如,"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或更多"的延续!

我究竟做错了什么?

ZyX*_*ZyX 6

@ysth解释了为什么会发生这种情况.要修复它,您可以使用以下正则表达式:

/([^_\n]|_.)*/s
Run Code Online (Sandbox Code Playgroud)


yst*_*sth 5

Perl不做"最左边"; 相反,每个正则表达式功能都有明确定义的行为方式.只要正则表达式的其余部分完全匹配,您的初始*将尽可能多地匹配.为防止它吞咽_,请执行以下操作:

/(.*(?!(?<=_)\n)_\n)*.*/
Run Code Online (Sandbox Code Playgroud)