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

时间:2015-07-25 10:45:18

标签: regex perl

我有以下代码:

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";

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

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

4 个答案:

答案 0 :(得分:11)

你有三个错误密谋破坏你的程序。如果您的代码顶部有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

答案 1 :(得分:3)

替代:

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

e.g。删除任何不是posix字母数字或逗号的内容。

答案 2 :(得分:2)

  

我试图删除除字母数字字符和逗号之外的所有字符。

您需要使用:

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

注意^作为[...]内的第一个字符,它否定了由[...]表示的字符类中的每个字符

[^a-zA-Z0-9,]+将匹配1个或多个非字母,数字或逗号的内容。

答案 3 :(得分:0)

尝试此操作以从字符串

中删除特殊字符
$str =~ s/[^[:print:]]//g;

OR

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