Perl和Ruby中的多行模式不同:Ruby错了吗?

让我们看看 Perl 代码和结果:

$s = "anbncn";
$s =~ s/^b/X/;
print $s;

a
b
c

$s = "anbncn";
$s =~ s/^b/X/m;
print $s;

a
X
c

我认为 Perl 是对的, ^ 仅在启用多行时才匹配中间新行之后的位置。

让我们看看红宝石:

$s = "anbncn"
print $s.sub(/^b/,'X')

a
X
c

$s = "anbncn"
print $s.sub(/^b/m,'X')

a
X
c

^ 匹配文本中间换行符后的位置,无论它是否处于多行模式。

在我的一生中,我找不到定义多行选项将做什么的 Ruby 文档,它在哪里?

Ruby 也没有单行模式吗?

undefined group option: /(?s)^b/

/^b./s 将解析但它的行为不像 Perl(。匹配新行)。

PS:我使用 Perl 5 和 Ruby 3.0 进行了测试。

回答

Ruby 和 Perl 的/m工作方式不同。


Ruby/m只改变了.. 它相当于 Perl 的/s.

  • Ruby /m:将换行符视为匹配的字符。

  • Perl /s:将字符串视为单行。也就是说,改变“。” 匹配任何字符,甚至是换行符,通常它不会匹配。

Perl/m改变了^和的行为$

  • Perl /m:将匹配的字符串视为多行。即,将“^”和“$”从匹配字符串的第一行的开头和最后一行的结尾更改为匹配字符串中每一行的开头和结尾。

^并且$在 Ruby 中始终以这种方式工作。Ruby 总是有效地拥有 Perl 的/m.

Ruby 和 Perl 都共享A, z, 和Z在字符串的开头、字符串的结尾或最后一个换行符之前进行匹配。

哪个是正确的?也不是,他们做自己的事。Perl 对^和的默认行为与POSIX 正则表达式$相同,但它们在其他方面不兼容。Python 使用等效于 Perl 的多行和单行模式(MULTILINE 和 DOTALL)。Ruby 简化了和的行为并使正则表达式更加明确。^$

也可以看看

  • Ruby 正则表达式锚
  • Ruby 正则表达式选项
  • Perl 正则表达式元字符
  • Perl 正则表达式修饰符概述

以上是Perl和Ruby中的多行模式不同:Ruby错了吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>