如何在Perl中将特定长度的单词与正则表达式匹配?

时间:2009-08-30 14:27:53

标签: regex perl

我想找一个只有三个字母的单词,以t开头,以e结尾。除了我所做的之外,还有其他办法吗?

open (FH, "alice.txt");
@lines = <FH>;
close(FH);

foreach $words(@lines)
{
   if($words =~ m/ t.e /g)
   {
     print $words," ";
   }
}

此外,我想找到长度超过3个字母的单词。我怎样才能做到这一点?除了空格之外,一个词可以有任何东西。任何一个词,不需要以t开头或以e结尾。任何超过3个字母的单词。

5 个答案:

答案 0 :(得分:5)

好吧,你的正则表达式无法在行的开头和结尾处提交单词。这就是\b断言的用途:

#!/use/bin/perl

use strict;
use warnings;

use Text::Wrap;

my $file = "alice.txt";

open my $fh, "<", $file
    or die "could not open $file: $!";

my @words;
while (<$fh>) {
    push @words, /\b(t\we)\b/g;
}
print "three letter words that start with t and end with e:\n",
    wrap "\t", "\t", "@words\n";

您可以通过查找包含超过3个字符的单词字符的任何内容来查找四个字母单词。 \w字符类匹配单词字符,量化符{4,}表示匹配前一个模式4次或更多次。将它们与单词边界断言放在一起,就得到/\b\S{4,}\b/

#!/use/bin/perl

use strict;
use warnings;

use Text::Wrap;

my $file = "alice.txt";

open my $fh, "<", $file
    or die "could not open $file: $!";

my @three;
my @four;
while (<$fh>) {
    push @three, /\b(t\we)\b/g;
    push @four, /\b(\w{4,})\b/g;
}
print "three letter words that start with t and end with e:\n",
    wrap("\t", "\t", "@three\n"),
    "four letter words:\n",
    wrap "\t", "\t", "@four\n";

如果您不想匹配[[:alpha:]]之类的内容,则可能需要使用\w而不是"t0e"

答案 1 :(得分:3)

你的代码很好。您可能希望将文字空间更改为\b(单词边界)。

如果您想在t和e之间匹配多个字符,请使用\w+代替.

答案 2 :(得分:2)

尝试使用\bt\w+e\b作为正则表达式。这会查找以字母't'开头并以字母'e'结尾的所有整个单词,并且其间至少有一个字母或数字。因此,“the”和“tattle”将匹配,“t999e”也将匹配。

答案 3 :(得分:1)

虽然单个正则表达式可能是您解决此特定问题的方法,但请放弃单个正则表达式应该执行所有检查的想法。有时候更容易分解条件并单独处理:

if( 3 == length( $word ) and $word =~ m/$regex/ ) { ... }

我认为当你这样写时,你会更容易看到你的意图。你会看到长度的限制,以及对内容的限制。

根据我的工作情况,我可能会创建一个管道(有时因为编程假装没有人发明if())。我认为这条管道更好地代表了人们逐步思考问题的方式:

open my( $fh ), '<', 'alice.txt' or die ...;

my @matches = 
              grep { /$regex/ }     # select only matching words
              grep { 3 == length }  # select only three character lines
              map  { chomp; $_ }
              <$fh>;

这种做事方式的好处在于它很容易转向步骤。你说你也想用超过三个字符的任何单词来尝试它。我放下正则表达式过滤器并调整长度过滤器:

my @matches = 
              grep { 3 < length }  # select only those with more than three characters
              map  { chomp; $_ }
              <$fh>;

答案 4 :(得分:0)

可以使用以下方法查找像te这样的单词:

/\b(t\Se)\b/

查找更长的单词(假设定义为:单词可以包含任何非空白字符):

/\b(\S{4,})\b/