我有以下代码:
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";
我的目的是删除那些特殊字符和空格,以便我可以拆分字符串以进行进一步处理。
使用上面的正则表达式,我试图删除除字母数字字符和逗号以外的所有字符。不幸的是,我得到了一个空行。我是regex的初学者,想知道我的表达式有什么问题。
您有三个错误共同破坏您的程序。如果你在你的代码顶部有use strict
和use 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: $strn";
$str =~ s/[^a-zA-Z0-9,]//g;
print "Post: $strn";
输出Pre: Uploaded 07-02▒05:14, Size 212.14▒MiB, ULed by someone
Post: Uploaded07020514,Size21214MiB,ULedbysomeone
我试图删除除字母数字字符和逗号以外的所有字符。
你需要使用:
$str =~ s/[^a-zA-Z0-9,]+//g;
注意^
作为[...]
中的第一个字符,它否定了由[...]
表示的字符类中的所有字符
[^a-zA-Z0-9,]+
将匹配1个或多个非字母、数字或逗号的字符。
备选项:
$str =~ s/[^p{PosixAlnum},]//g;
。删除任何非正、字母、数字或逗号的内容
尝试从字符串
中删除特殊字符$str =~ s/[^[:print:]]//g;
或
$str =~ s/[^[print:]]//g;
sed "s/[^a-zA-Z ]//g"
您可以在bash中完成此操作。无意义但有趣