Perl正则表达式 - 删除所有非字母数字字符和逗号

4

我有以下代码:

my $str = 'Uploaded 07-02▒05:14, Size 212.14▒MiB, ULed by someone';
print "Pre:".$str."\n";
my $str =~ s/^[a-zA-z0-9,]//g;
print "Post:".$str."\n";

我的目标是删除特殊字符和空格,以便我可以拆分字符串进行进一步处理。

使用上面的正则表达式,我试图删除除字母数字字符和逗号以外的所有字符。不幸的是,我得到了一个空行。我是一个正则表达式的初学者,想知道我的表达式有什么问题。


2
使用严格模式;使用警告。您已经在第一行声明了 $str 变量,在第三行再次声明它。 - Alexander
5个回答

17

您的程序有三个错误会同时产生影响。如果您像应该做的那样在代码顶部使用 use strictuse warnings,Perl 会打印消息以提醒您。

  • 您声明了第二个 $str,因此它是 undef,并作为空字符串输出。

  • 插入符号在字符类外面,因此它作为字符串开头锚点来起作用,而不是对类取反。

  • 您使用了 [a-zA-z0-9] 作为字符类。 A-z 包括了大写字母和小写字母表中的所有字母,还包括了字符 [\]^_`。您需要改用 [a-zA-Z0-9]

下面是一些可工作的代码。您的文本字符串包含一个 Unicode 字符 U+2592 Medium Shade,所以我必须使用 use utf8 标记代码为 UTF-8 编码,并使用 use open 将 STDOUT 设置为接受 UTF-8 编码。

use utf8;
use strict;
use warnings;

use open qw/ :std :encoding(utf-8) /;

my $str = 'Uploaded 07-02▒05:14, Size 212.14▒MiB, ULed by someone';

print "Pre: $str\n";

$str =~ s/[^a-zA-Z0-9,]//g;

print "Post: $str\n";

输出

Pre: Uploaded 07-02▒05:14, Size 212.14▒MiB, ULed by someone
Post: Uploaded07020514,Size21214MiB,ULedbysomeone

有时候不是删除有问题的字符更有用,而是替换它们。那么你应该将 $str =~ s/[^a-zA-Z0-9,]//g; 替换为 $str =~ s/[^a-zA-Z0-9,]/X/g; 其中 X 是你要替换的内容。 - Znik

6

我正在尝试删除除字母数字字符和逗号以外的所有字符。

您需要使用:

$str =~ s/[^a-zA-Z0-9,]+//g;

注意,在 [...] 中作为第一个字符的 ^ 会否定括号内的每个字符类。

[^a-zA-Z0-9,]+ 将匹配任何不是字母、数字或逗号的一个或多个字符。


当插入符号在方括号外部时的意图是什么? - Joel G Mathew
^[...] 之外被称为起始锚点,用于匹配行的开头。 - anubhava
不幸的是,即使进行了此编辑,该字符串仍会打印为null。 - Joel G Mathew
请查看这个工作演示:http://ideone.com/cTJrSb。您需要像我在答案中展示的那样,再次删除“my”。使用“my”将重新初始化变量。 - anubhava
1
忘记使用“use warnings”可能会带来风险。谢谢。 - Joel G Mathew
当然是不正确的,这是从问题中复制/粘贴的错误。感谢指出,已经更正。 - anubhava

4

替代方案:

$str =~ s/[^\p{PosixAlnum},]//g;

例如:删除任何不是POSIX字母数字或逗号的内容。

3
@Alexander:\p{...}Unicode属性。在perldoc perluniprops中有一个可用的列表。 - Borodin

0
尝试使用以下方法从字符串中删除特殊字符
$str =~ s/[^[:print:]]//g;

或者

$str =~ s/[^[print:]]//g;

1
这会将所有非可打印字符,如^M,替换为 null。 - sandeep

-1

sed "s/[^a-zA-Z ]//g"你可以在bash中这样做。毫无意义但有趣。


这个问题是关于Perl而不是Bash的。此外,由于这是关于完整脚本而不是单行代码的问题,你的回答实际上并没有回答问题,问题是要从变量$str中删除一些字符。此外,这个答案是错误的,因为它没有考虑到数字和逗号。 - Dada

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接