好的,我要用一个简单的Perl 5脚本打印出以D开头并以E结尾的单词......
$_ = "Dog Die Do Dome";
/^d.*e$/i;
如图所示,我使用正则表达式搜索我的文本以查找这些单词,但是如何将它们打印出来?提前感谢您的帮助。
答案 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
结尾且不包含空格的字词。因此,它现在将分别与Die
和Dome
匹配,但不会与Dog
和Do
匹配。这是正则表达式中的常见技巧。例如,您有一个字符串foo-bar-bam
,并且只想匹配第一个单词。使用/[^-][^-]*/
可以解决问题(请记住*
可以代表 零 或更多前面的内容。因此,您需要将其加倍才能匹配最后一个。)。这主要用于 grep 或 sed 的旧版本,在这些版本中,您没有Perl扩展的regualar表达式的强大功能。在上面的示例中,我使用了+
而不是*
,因为+
表示匹配 一个 或更多前面的内容。
Perl还可以通过在*
或+
之后添加问号来使非正规的表达式变得非常贪婪:
my $string =~ /d.+?e/ig;
但是,在您的情况下,这将匹配Dog Die
和Dome
,这可能不是您想要的。
以下是该计划:
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)
答案 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 }
~
〜
〜
〜