如何查找以| b开头并以| b结尾的所有单词。 (例如:“副词”和“巴拉莱卡”)

时间:2016-08-14 13:01:14

标签: regex perl

以下perl程序有一个正则表达式,用于实现我的目的。但是,这也捕获了字符串中的结果。我怎样才能获得由空格/换行符/制表符分隔的字符串?

我使用的测试数据如下: http://sainikhil.me/stackoverflow/dictionaryWords.txt

use strict;
use warnings;

sub print_a_b {
    my $file = shift;

    $pattern = qr/(a|b|A|B)\S*(a|b|A|B)/;
    open my $fp, $file;

    my $cnt = 0;
    while(my $line = <$fp>) {
        if($line =~ $pattern) {
            print $line;
            $cnt = $cnt+1;
        }
    }
    print $cnt;
}

print_a_b @ARGV;

2 个答案:

答案 0 :(得分:3)

您可以考虑使用anchor like \b: word boundary

这有助于在单词之前和之后应用正则表达式。

 \b(a|b|A|B)\S*(a|b|A|B)\b

更简单,因为Avinash Raj添加了in the comments

(?i)\b[ab]\S*[ab]\b

(使用case insensitive flag or modifier

答案 1 :(得分:1)

如果同一行中有多个单词,则可以在正则表达式中使用单词边界,如下所示:

(?i)\b[ab][a-z]*[ab]\b

Regular expression visualization

模式代码是:

$pattern = /\b[ab][a-z]*[ab]\b/i;

但是,如果要检查只有单词的行,则可以使用:

(?i)$[ab][a-z]*[ab]$

更新:对于您的评论*以相同字符*开头和结尾的行,您可以使用此正则表达式:

(?i)\b([a-z])[a-z]*\1\b

但如果你想要任何角色而不是像上面那样的字母,你可以使用:

(?i)\b(.)[a-z]*\1\b