Regex 捕获一行中的所有单词,并使用Perl正则表达式计算它们的出现次数

Regex 捕获一行中的所有单词,并使用Perl正则表达式计算它们的出现次数,regex,perl,Regex,Perl,我试图知道一个段落中有多少个单词,然后找出每个单词出现的次数。 我可以这样做,但有没有其他方法只使用正则表达式 my $string = "John is a good boy. John goes to school with his brother Johnny. When John is hungry, he eats his tiffin."; my @list = (); while($string =~ /(\b\w+\b)/gi) { push(@list, $1)

我试图知道一个段落中有多少个单词,然后找出每个单词出现的次数。 我可以这样做,但有没有其他方法只使用正则表达式

my $string = "John is a good boy. John goes to school with his brother Johnny. When John is hungry, he eats his tiffin.";
my @list = ();
while($string =~ /(\b\w+\b)/gi)
{
        push(@list, $1);
}

my %counts;
for (@list) {
   $counts{$_}++;
}
print "$#list \n";
foreach my $keys (keys %counts) {
   print "$keys = $counts{$keys}\n";
}
输出应该是

20
brother = 1
a = 1
goes = 1
is = 2
good = 1
to = 1
tiffin = 1
When = 1
boy = 1
his = 2
school = 1
Johnny = 1
he = 1
eats = 1
John = 3
with = 1
hungry = 1

我看不到一种纯粹用正则表达式来实现这一点的方法,如果这种方法真的存在,那么它将是一个非常复杂的正则表达式,很难维护。但是,只要使用散列并丢失列表,就可以简化所拥有的内容

use strict;
use warnings;

my $string = "John is a good boy. John goes to school with his brother Johnny. When John is hungry, he eats his tiffin.";
my %counts;
my $word_count = 0;
while($string =~ /\b(\w+)\b/g)
    {
    $counts{$1}++;
    $word_count++;
    }

print "$word_count\n";
foreach my $keys (keys %counts)
    {
    print "$keys = $counts{$keys}\n";
    }

注意:我稍微调整了正则表达式,因为您不需要捕获组中的“\b”,并且不需要区分大小写,因为您不匹配特定字符串。并添加了“use strict;”和“use warnings;”,您应该始终将其放在perl的顶部,以避免出现任何问题。

我看不到一种纯粹使用正则表达式来实现这一点的方法,如果确实存在这种方法,那么它将是一个非常复杂的正则表达式,很难维护。但是,只要使用散列并丢失列表,就可以简化所拥有的内容

use strict;
use warnings;

my $string = "John is a good boy. John goes to school with his brother Johnny. When John is hungry, he eats his tiffin.";
my %counts;
my $word_count = 0;
while($string =~ /\b(\w+)\b/g)
    {
    $counts{$1}++;
    $word_count++;
    }

print "$word_count\n";
foreach my $keys (keys %counts)
    {
    print "$keys = $counts{$keys}\n";
    }

注意:我稍微调整了正则表达式,因为您不需要捕获组中的“\b”,并且不需要区分大小写,因为您不匹配特定字符串。并添加了“use strict;”和“use warnings;”,您应该始终将其放在perl的顶部,以避免出现任何问题。

您已经在使用正则表达式进行操作了吗?不,我的意思是使用正则表达式来计算出现的次数。我正在使用列表和散列。你想要一个甚至不使用散列的解决方案吗?是的,可行吗?我想不出一种方法来单独使用正则表达式-如果可能的话,它将使用一个非常复杂的正则表达式,它将不会像你已经拥有的那样易于维护。你已经在使用正则表达式了吗?不,我的意思是用正则表达式来计算发生的次数。我正在使用列表和散列。你想要一个甚至不使用散列的解决方案吗?是的,它可行吗?我想不出一个单独使用正则表达式的方法-如果可能的话,它将使用一个非常复杂的正则表达式,而这个正则表达式几乎不像你已经拥有的那样可维护。