我正在尝试编写一个正则表达式来识别单行文本,下划线 ( _ ) 被识别为行继续符。例如,“foo_\nbar”应被视为单行,因为“foo”以下划线结尾。我在尝试:
$txt = "foo_\nbar";
print "$&\n" if $txt =~ /.*(_\n.*)*/;
但是,这仅打印:
foo_
这似乎违反了 Perl 正则表达式的“最左最长”规则!
有趣的是,如果我删除正则表达式中的最后一个星号 (*),即:
$txt = "foo_\nbar";
print "$&\n" if $txt =~ /.*(_\n.*)/;
它是否打印:
foo_
bar
但我需要星星来识别“0 或更多”的延续!
我究竟做错了什么?
最佳答案
@ysth 解释了为什么会发生这种情况。要修复它,您可以使用以下正则表达式:
/([^_\n]|_.)*/s
关于regex - 这是否违反了 'leftmost longest' 原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3127591/