【问题标题】:Perl regex - remove all characters except alphanumeric characters and commaPerl 正则表达式 - 删除除字母数字字符和逗号之外的所有字符
【发布时间】:2015-10-16 00:25:41
【问题描述】:

我有以下代码:

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

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

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

【问题讨论】:

  • 使用严格;使用警告;您已经在字符串 1 中声明了 $str,然后再次在字符串 3 中声明它

标签: regex perl


【解决方案1】:

您有三个错误密谋破坏您的程序。如果你的代码顶部有 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 是您的替代品。
【解决方案2】:

替代方案:

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

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

【讨论】:

  • @Alexander:这个\p{...} 是一个Unicode 属性perldoc perluniprops 中有一个可用列表
【解决方案3】:

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

你需要使用:

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

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

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

【讨论】:

  • 插入符号插入方括号外的目的是什么?
  • ^[...] 外被称为起始锚点,用于匹配行起始。
  • 不幸的是,即使进行了此编辑,字符串仍被打印为 null。
  • See this working demo 您需要第二次删除my,正如我在回答中所展示的那样。使用my 将再次初始化变量。
  • 忘记use warnings 的危险。谢谢
【解决方案4】:

试试这个从字符串中删除特殊字符

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

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

【讨论】:

  • 这会将所有不可打印的字符(如 ^M)替换为 null
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 2015-10-07
  • 2016-04-03
  • 2011-09-08
  • 2020-01-15
  • 2013-05-01
  • 1970-01-01
相关资源
最近更新 更多