如何删除除数字和给定列表之外的所有单词?

时间:2014-06-16 11:19:17

标签: regex perl

我试图删除字符串中的所有单词,除了数字和给定列表(这里使用'dummy'作为示例)。我已经取得了一些进展并达到了以下阶段。

$s =~  s/[^\W\-\,0-9\s\.{dummy}]//g;

这有两个问题 - 作为虚拟子集的单词不会被删除,它会遗漏像%等字符。

以下是示例输出。

输入字符串:I scored 75% in the final examination.

输出字符串:d 75% m.

但输出应该是75 .

编辑: 从我的问题的措辞可能还不清楚,但我还需要标点符号''。在最后或任何其他地方,而不会打扰他们出现的顺序。请注意,我还需要删除回车等特殊字符。

2 个答案:

答案 0 :(得分:2)

对于标点符号,您可以使用Unicode类' Punct'。

use strict;
use warnings;

my $s = 'I scored 75% in the final examination.';
$s =~ s/\b(dummy|final)\b|[^\d\p{Punct}]/$1 if defined $1/eg;
print "$s\n";

但是,它包括.%。 为了保留特定的标点符号,您可能需要定义自己的集合。

use strict;
use warnings;

my $s = 'I scored 75% in the final examination.';
$s =~ s/\b(dummy|final)\b|[^\d.,;]/$1 if defined $1/eg;

print "$s\n";

答案 1 :(得分:0)

$s =~ s/\D+//g;这个例子应该没​​问题。 \ D = =非数字。

或者你需要最后一个点?