我想找一个只有三个字母的单词,以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个字母的单词。
答案 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/