打印正则表达式匹配的单词

时间:2012-12-31 22:04:25

标签: regex perl

好的,我要用一个简单的Perl 5脚本打印出以D开头并以E结尾的单词......

$_ = "Dog Die Do Dome";
/^d.*e$/i;

如图所示,我使用正则表达式搜索我的文本以查找这些单词,但是如何将它们打印出来?提前感谢您的帮助。

5 个答案:

答案 0 :(得分:4)

您可以使用/g修饰符捕获到数组。

use feature 'say';
my @words = /\bd\S+e\b/ig;
say for @words;

在列表上下文中,这将返回以“d”开头并以“e”结尾的所有匹配项。请注意,您无法使用.*,因为该匹配是贪婪的,因此"dog do die"将使用贪婪匹配返回整个字符串dog do die,而不只是"die"。使用边界\b一词会阻止您进行部分匹配,例如foobaresk

答案 1 :(得分:2)

首先,你的正则表达式捕获整个字符串。正则表达式通常贪心,因此.*将匹配字符串中最长的部分。由于您的正则表达式以d开头并以e结尾,因此它将匹配您的整个字符串。

有几种方法可以避免这种情况:

my $string = "Dog Die Do Dome";
my $string =~ /d[\S]+e/ig;

由于\S没有空格,因此您只匹配以D开头并以E结尾且不包含空格的字词。因此,它现在将分别与DieDome匹配,但不会与DogDo匹配。这是正则表达式中的常见技巧。例如,您有一个字符串foo-bar-bam,并且只想匹配第一个单词。使用/[^-][^-]*/可以解决问题(请记住*可以代表 或更多前面的内容。因此,您需要将其加倍才能匹配最后一个。)。这主要用于 grep sed 的旧版本,在这些版本中,您没有Perl扩展的regualar表达式的强大功能。在上面的示例中,我使用了+而不是*,因为+表示匹配 一个 或更多前面的内容。

Perl还可以通过在*+之后添加问号来使非正规的表达式变得非常贪婪:

my $string =~ /d.+?e/ig;

但是,在您的情况下,这将匹配Dog DieDome,这可能不是您想要的。

以下是该计划:

use strict;
use warnings;
use feature qw(say);

my $string = "Dog Die Do Dome";

my @matches = ($string =~ /D\S+e/gi);

for my $word (@matches) {
    say "The first match is $word";
}

并打印出来:

 The first match is Die
 The first match is Dome

好吧,也许我不应该使用The first match,但你明白了。尝试使用各种正则表达式的示例程序,看看会发生什么。

答案 2 :(得分:1)

使用print声明

您使用print语句将输出发送到屏幕。由于您匹配整条线路,因此您无需在此处执行任何复杂操作;你可以使用隐含的 $ _ 变量。例如:

print if /^d.*e$/i

答案 3 :(得分:1)

>cat temp
Dog Die Do Dome
>perl -lne '@a=split" ";foreach(@a){print if(/^[dD].*[eE]$/)}' temp
Die
Dome

答案 4 :(得分:0)

  1 
  2 my $word_list = "Dog Die Do Dome";
  3 my @words = split ' ', $word_list;
  4 for my $word (@words) {
  5         print "$word\n" if $word =~ /^d.*e$/i;
  6     }
~