使用正则表达式在Perl中使用大写字母打印单词

时间:2014-06-19 19:56:48

标签: regex perl

我试图在Perl中创建一个算法,只打印只有第一个字母为大写字母的单词。例如:

Hey
now
Brown cow

应该打印:

Hey
Brown

但它正在打印:

Hey
Brown cow

这是我的代码:

while (<>) {
    if (/^[A-Z][a-z]+/) {
        print;
    }
}

print "\n"

4 个答案:

答案 0 :(得分:2)

您目前正在打印以大写词开头的行。

要打印文字,您需要调整正则表达式以捕获单词:

while (<>) {
    while (/\b([A-Z][a-z]+)/g) {
        print $1, "\n";
    }
}

或者单独开头,然后过滤出大写字样:

while (<>) {
    for (grep /^[A-Z]/, split) {
        print $_, "\n";
    }
}

答案 1 :(得分:1)

以下内容应该有效:

while ( /\b([A-Z][a-z]*)\b/g ) { print $1 . $/; }

从单词边界(\b)的开头开始,我们只需要一个大写字母([A-Z])。要完成这个单词,我们会允许任意数量的小写字母([a-z]*),直到我们到达单词结尾(\b)。

Here's a working example.

答案 2 :(得分:1)

你的正则表达不是骗你的。它匹配大写单词,但是你继续打印整行。

如果您只想打印匹配的单词,则以下内容应该有效:

my @words;
while (<>) {
    @words = split(/\s+/);
    foreach my $word (@words) {
        print if (/^[A-Z][a-z]+/);
    }
}

答案 3 :(得分:0)

你的正则表达式在行的开头建议大写单词。它还建议你不要考虑I一个字。鉴于您感兴趣的角色,您可以使用 -

来解决这个问题

/^[A-Z](?i:[a-z])*/m and print $&,"\n";

我添加了多行修饰符,因为我无法告诉您用于行分隔符的内容。