0

我是 PERL 的新手,正在使用正则表达式来匹配等于或超过 3 个字母的单词。这是我正在尝试的程序。我尝试添加 \w{3,} 因为它应该匹配更多的 3 个字符。但它仍然匹配一个单词中的 <3 个字符。例如,如果我给出“这是一个模式”。我希望我的 $field 只匹配“This”和“Pattern”并跳过“is”和“a”。

#!/usr/bin/perl
     while (<STDIN>) {
           foreach my $reg_part (split(/\s+/, $_)) {
                if ($reg_part =~ /([^\w\@\.]*)?([\w{3,}\@\(\)\+\$\.]+)(?::(.+))?/) {
                        print "reg_part = $reg_part \n";
                        my ($mod, $field, $pat) = ($1, $2, $3);
                        print "#$mod#$field#$pat#$negate#\n";
                }
        }
}

exit(0);

我错过了什么?

4

2 回答 2

4

打破你的正则表达式。

你知道你想要三个单词字符,所以指定:-

# Match three word characters.

\w{3}

在那之后,你真的不在乎这个词是否有更多的字符,但你也不会阻止它。

# Match 0 or more word characters
\w*

最后,您要确保有界限来捕捉单词的结尾。所以,把它们放在一起。要匹配至少包含三个单词字符(可能更多)的单词,请使用:-

# Word boundaries at start and end    
\b\w{3}\w*\b

注意 -\w匹配字母数字 - 如果它只是你需要的字母: -

# Alpha only
\b[A-Za-z]{3}[A-Za-z]*\b
于 2012-11-12T21:31:08.230 回答
3

你有

[\w{3,}...]+

这与

[{},3\w...]+

我想你想要

(?:\w{3,}|[\$\@()+.])+
于 2012-11-12T21:39:41.333 回答