gpt4 book ai didi

regex - 为什么带有/mg 修饰符的 perl 正则表达式匹配过去的行尾?

转载 作者:行者123 更新时间:2023-12-04 01:13:42 25 4
gpt4 key购买 nike

这与perl multiline regex to separate comments within paragraphs有关,
但只关注正则表达式语法的一个问题。
根据 perlre: Modifiers ,/m正则表达式修饰符意味着

Treat the string being matched against as multiple lines. That is, change "^" and "$" from matching the start of the string's first line and the end of its last line to matching the start and end of each line within the string.


因此,使用以下代码:
#!/usr/bin/perl
use strict; use warnings;
$/ = ''; # one paragraph at a time
while(<DATA>)
{
print "original:\n";
print;
s/^([^B]*)(B.*?)$/>$1|$2</mg;
print "\n\nafter substitution:\n";
print;
}

__DATA__
aaaaBaBaBB
bbbbBbadbe
cccc
dddd
eeeeBeeeee
ffff
gggg

我希望正则表达式引擎的行为如下。
第 1 行:匹配,因为它会在此行的开头和结尾之间找到两个模式。
第 2 行:同上。
第 3 行: 比赛。第一个正则表达式组(在第一组括号中)匹配。
但是当我们到达队伍的尽头时
我们还在找 , 开始
第二个正则表达式组。由于我们指定了 /m ,此特定行的结尾表示我们已到达 $不满足整个模式。
第 4 行:我们开始新的一行,因此我们遇到了一个新的 ^ .再次,没有匹配。
第 5 行:匹配。两个正则表达式组都位于行的开头和结尾之间,即在 ^ 之间和 $ ,完全按照规定。
因此我期待看到
>aaaa|BaBaBB<
>bbbb|Bbadbe<
cccc
dddd
>eeee|Beeeee<
ffff
gggg
相反,似乎在第 3 行,引擎 忽略 行尾并搜索过去。
它将第 3--5 行视为一行,如果我们愿意突然忽略 $表示行尾,将满足正则表达式。这是我们看到的:
>aaaa|BaBaBB<
>bbbb|Bbadbe<
>cccc
dddd
eeee|Beeeee<
ffff
gggg

这与 /m如何一致?规范?这种行为记录在哪里?
> perl --version

This is perl 5, version 18, subversion 4 (v5.18.4) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)

最佳答案

[^B]*将匹配尽可能多的非 B 字符,包括换行符。
将其替换为 [^B\n]*可以做你想做的。

关于regex - 为什么带有/mg 修饰符的 perl 正则表达式匹配过去的行尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64046274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com