我正在使用Unix(\ n)换行符处理多行字符串。
它的一些行的形式为“A,a”(即大写字母,逗号,空格,小写字母),我想从字符串中删除它们。
我可以用正则表达式替换来实现这一点,但有一个我不明白的谜:
使用“[A-Z]”和“[a-z]”的正则表达式在正常模式和多行模式下都有效。
使用“\ p {Lu}”和“\ p {Ll}”的正则表达式有效,但仅在正常模式下,不在多行模式下。
这些成功的每一个:
$all =~ s/\n\K *[A-Z], [a-z]\n//g; # 1
$all =~ s/^ *[A-Z], [a-z]\n//mg; # 2
$all =~ s/\n\K *\p{Lu}, \p{Ll}\n//g; # 3
但是这次失败:
$all =~ s/^ *\p{Lu}, \p{Ll}\n//mg; # 4
我希望/ m开关改变正则表达式中“^”的含义,但没有别的。所以,我希望语句4能够工作,就像语句1,2和3.语句2似乎表明多行语法是正常的,而语句3似乎表明Unicode字符属性符合预期,因此,当我将这些结合起来时,我希望语句4可以工作。
我看过Tom Christensen的回答Why does modern Perl avoid UTF-8 by default?,但我没有看到任何关于多行正则表达式匹配的内容,也没有在其他地方找到答案。
答案 0 :(得分:3)
我无法复制你的问题。
$ perl -wle'
$all = "foo\n A, x\nmeow";
$all =~ s/^ *[A-Z], [a-z]\n//mg;
print $all;
'
foo
meow
$ perl -wle'
$all = "foo\n A, x\nmeow";
$all =~ s/^ *\p{Lu}, \p{Ll}\n//mg;
print $all;
'
foo
meow
在Linux上使用5.8.8,5.10.1,5.12.4(线程)和5.16.0进行测试。
最佳猜测:pos($all)
不为零。也许你做了像if ($all =~ /.../g)
那样愚蠢的事情。
我无法首先删除空格。
$ perl -wle'
$all = "foo\nA, x\nmeow";
$all =~ s/^ *[A-Z], [a-z]\n//mg;
print $all;
'
foo
meow
$ perl -wle'
$all = "foo\n A, x\nmeow";
$all =~ s/^ *\p{Lu}, \p{Ll}\n//mg;
print $all;
'
foo
meow
在cygwin上使用5.10.1(线程)进行测试。
>perl -wle"$all = qq{foo\nA, x\nmeow}; $all =~ s/^ *[A-Z], [a-z]\n//mg; print $all;"
foo
meow
>perl -wle"$all = qq{foo\nA, x\nmeow}; $all =~ s/^ *\p{Lu}, \p{Ll}\n//mg; print $all;"
foo
meow
在Windows(ActivePerl)上使用5.14.0(线程)和5.14.2(线程)进行测试。
但是,AHA !!!!
>perl -wle"$all = qq{foo\nA, x\nmeow}; $all =~ s/^ *[A-Z], [a-z]\n//mg; print $all;"
foo
meow
>perl -wle"$all = qq{foo\nA, x\nmeow}; $all =~ s/^ *\p{Lu}, \p{Ll}\n//mg; print $all;"
foo
A, x
meow
在Windows(ActivePerl)上使用5.10.1(线程),5.12.1(线程)和5.12.4(线程)进行测试。
旧版本的Perl似乎存在一个错误。它似乎已在5.14中修复。该错误似乎位于优化器中(如-Mre=debug
所示),因此可以通过“禁用”优化器来绕过该错误。
>perl -wle"$all = qq{foo\nA, x\nmeow}; $all =~ s/^ *\p{Lu}, \p{Ll}\n//mg; print $all;"
foo
A, x
meow
>perl -wle"$all = qq{foo\nA, x\nmeow}; $all =~ s/^ *\p{Lu}{1}, \p{Ll}\n//mg; print $all;"
foo
meow