让我们看看 Perl 代码和结果:
$s = "a\nb\nc\n";
$s =~ s/^b/X/;
print $s;
a
b
c
$s = "a\nb\nc\n";
$s =~ s/^b/X/m;
print $s;
a
X
c
Run Code Online (Sandbox Code Playgroud)
我认为 Perl 是对的, ^ 仅在启用多行时才匹配中间新行之后的位置。
让我们看看红宝石:
$s = "a\nb\nc\n"
print $s.sub(/^b/,'X')
a
X
c
$s = "a\nb\nc\n"
print $s.sub(/^b/m,'X')
a
X
c
Run Code Online (Sandbox Code Playgroud)
^ 匹配文本中间换行符后的位置,无论它是否处于多行模式。
在我的一生中,我找不到定义多行选项将做什么的 Ruby 文档,它在哪里?
Ruby 也没有单行模式吗?
undefined group option: /(?s)^b/
Run Code Online (Sandbox Code Playgroud)
/^b./s 将解析但它的行为不像 Perl(。匹配新行)。
PS:我使用 Perl 5 和 Ruby 3.0 进行了测试。
Ruby 和 Perl 的/m工作方式不同。
Ruby/m只改变了.. 它相当于 Perl 的/s.
Ruby /m:将换行符视为匹配的字符。
Perl /s:将字符串视为单行。也就是说,改变“。” 匹配任何字符,甚至是换行符,通常它不会匹配。
Perl/m改变了^和的行为$。
/m:将匹配的字符串视为多行。即,将“^”和“$”从匹配字符串的第一行的开头和最后一行的结尾更改为匹配字符串中每一行的开头和结尾。^并且$在 Ruby 中始终以这种方式工作。Ruby 总是有效地拥有 Perl 的/m.
Ruby 和 Perl 都共享\A, \z, 和\Z在字符串的开头、字符串的结尾或最后一个换行符之前进行匹配。
哪个是正确的?也不是,他们做自己的事。Perl 对^和的默认行为与POSIX 正则表达式$相同,但它们在其他方面不兼容。Python 使用等效于 Perl 的多行和单行模式(MULTILINE 和 DOTALL)。Ruby 简化了和的行为并使正则表达式更加明确。^$
也可以看看
| 归档时间: |
|
| 查看次数: |
848 次 |
| 最近记录: |