my $line = "The quick brown fox jumps over the lazy dog.";
while ($line){
$line =~ s/["",]//ig; #[] means to get rid of
#print $line
$line = lc($line); #lc is lowercase
while ($line=~m/\b(\w+\s\w+)\b/ig){ #[^ ] means any character except spaces and newline #($line=~m/\b(\s\w+\s\w+)\b/ig)
my $word =$1;
print "$word\n";
$wordcount{$word} += 1;
}
last;
}
close(INPUT);
close(OUTPUT);
清流出言将曰:快速,快速棕色,棕色狐狸,狐狸跳....然而,对于上面的代码我只得到快速,棕色狐狸,跳过....
3条答案
按热度按时间hwazgwia1#
可以捕获两者,但不使用先行处理来使用第二个,以便对重叠
根据需要打印。这允许单词之间有任意数量的空格。†
一个解释。
在
(\w+)
捕获到一个单词后,lookahead(?=...)
只Assert(“lookahead”)后面有另一个单词,但不“消费”它,也不超越它(而我们用(额外的)括号捕获它,所以我们在$1
和$2
中得到两个单词)。我们只消费了一个单词,正则表达式引擎就停留在第一个单词后面的空格之后。因此,在下一次迭代中,它可以匹配下一个单词,也就是前视最后“看到”的那个单词,然后它再次通过前视发现下一个单词,再次捕获这两个单词,等等。
†如果只允许一个空格,就不要使用
+
,而只使用\s
。如果只需要一个文字空格--没有制表符等,请查看\s
匹配的内容的链接--那么为了清楚起见,就不要使用\s
,而是使用``(文字空格,SPACE)或[ ]
,“字符类”(括号)中的文字空格。bqf10yzr2#
您可以使用
正则表达式解释
(
捕捉”组\w+
匹配单词)
闭合”组\s
匹配空格(?=
LookaheadAssert-Assert以下正则表达式匹配(
捕捉组\w+\b
匹配单词)
关闭”组)
关闭前瞻请参阅正则表达式demo
Perl示例
输出
cu6pst1q3#
如果将字符串拆分为一个单词数组,则根本不需要对正则表达式做任何花哨的操作: