拆分正则表达式,仅返回字符,数字和下划线。佩尔

时间:2018-11-12 17:47:07

标签: regex perl

试图分手

#!/usr/bin/perl -w

具有以下代码

use strict;
use warnings;

my %words;

while (my $line = <>)
{
foreach my $word (split /:|,\s*|\/|!|\#|-/, $line)
{
    $words{$word}++;
}
}

foreach my $word (keys %words)
{
print "$word: $words{$word}\n";
}

有没有更简单的方法来使split命令仅在单词,数字和下划线处分开?而不是设置所有这些定界符。

尝试获取输出

usr: 1
bin: 1
perl: 1

2 个答案:

答案 0 :(得分:6)

不要拆分,提取。

++$words{$_} for $line =~ /\w+/g;

答案 1 :(得分:2)

您还可以使用split和取反的单词@DanielWagner says

foreach my $word (split /\W+/, $line) {
  $words{$word}++;
}

但是请注意,由于您的字符串以非单词字符开头,因此它将返回的第一个单词是字符串开头的空字符串。

character class是完成此任务的另一个工具(但比代码和文件名更适合散文使用),它使用Unicode规则来确定单词的开始和结束位置,并考虑了撇号等单词( can't)。要利用此功能,您首先需要将输入拆分为包含单词和非单词的列表,然后找到单词(最简单的方法可能是使用至少包含一个单词字符的任何元素):

foreach my $word (grep { m/\w/ } split /\b{wb}/, $line) {
  $words{$word}++;
}

\b{wb}正则表达式序列需要Perl 5.24 +。