perl 有没有办法匹配句子中所有相邻的单词?

k5hmc34c  于 2022-11-15  发布在  Perl
关注(0)|答案(3)|浏览(125)
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);

清流出言将曰:快速,快速棕色,棕色狐狸,狐狸跳....然而,对于上面的代码我只得到快速,棕色狐狸,跳过....

hwazgwia

hwazgwia1#

可以捕获两者,但不使用先行处理来使用第二个,以便对重叠

use warnings;
use strict;
use feature 'say';

my $string = shift // 'The quick brown fox jumps over the lazy dog.';
 
while ( $string =~ /(\w+)\s+(?=(\w+))/g ) { 
   say "$1 $2";
}

根据需要打印。这允许单词之间有任意数量的空格。†
一个解释。
(\w+)捕获到一个单词后,lookahead (?=...)只Assert(“lookahead”)后面有另一个单词,但不“消费”它,也不超越它(而我们用(额外的)括号捕获它,所以我们在$1$2中得到两个单词)。我们只消费了一个单词,正则表达式引擎就停留在第一个单词后面的空格之后。
因此,在下一次迭代中,它可以匹配下一个单词,也就是前视最后“看到”的那个单词,然后它再次通过前视发现下一个单词,再次捕获这两个单词,等等。
†如果只允许一个空格,就不要使用+,而只使用\s。如果只需要一个文字空格--没有制表符等,请查看\s匹配的内容的链接--那么为了清楚起见,就不要使用\s,而是使用``(文字空格,SPACE)或[ ],“字符类”(括号)中的文字空格。

bqf10yzr

bqf10yzr2#

您可以使用

(\w+)\s(?=(\w+\b))
正则表达式解释
  • (捕捉”组
  • \w+匹配单词
  • )闭合”组
  • \s匹配空格
  • (?= LookaheadAssert-Assert以下正则表达式匹配
  • (捕捉组
  • \w+\b匹配单词
  • )关闭”组
  • )关闭前瞻

请参阅正则表达式demo

Perl示例
my $line = "The quick brown fox jumps over the lazy dog.";

while ($line =~ /(\w+)\s(?=(\w+\b))/g) {
    print("$1 $2\n");
}
输出
The quick
quick brown
brown fox
fox jumps
jumps over
over the
the lazy
lazy dog
cu6pst1q

cu6pst1q3#

如果将字符串拆分为一个单词数组,则根本不需要对正则表达式做任何花哨的操作:

#!/usr/bin/env perl                                                                                                                                                                                                                              
use strict;
use warnings;
use feature qw/say/;

my $line = "The quick brown fox jumps over the lazy dog.";
$line =~ s/[^\w\s]//g; # Remove non-word, non-whitespace characters                                                                                                                                                                              
my @words = split ' ', $line;
for my $i (0 .. $#words - 1) {
    say "$words[$i] $words[$i + 1]";
}

相关问题