regex - 这是否违反了 'leftmost longest' 原则?

标签 regex perl

我正在尝试编写一个正则表达式来识别单行文本,下划线 ( _ ) 被识别为行继续符。例如,“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/

相关文章:

windows - HTML::TreeBuilder 中的内存泄漏

python-re : How do I match an alpha character

regex - awk 连接字符串直到包含子字符串

javascript - JavaScript 或 adobe livecycle 工具的表达式或正则表达式

json - 使用 Perl 模块 LWP::Authen::OAuth2 创建 Google Team Drive

perl - 我应该如何处理无法修复的错误的失败测试

perl - 用 Perl 制作 PDF 报告?

regex - 需要用一个已知的主机名grep/etc/hosts,然后从/etc/hosts中抓取该主机名的ip地址

PHP - 为什么我的 preg_match 不起作用?

perl - 如何在不禁用严格 'refs' 的情况下重命名 perl __ANON__ sub?