2016-09-11 36 views
0

我有一个包含文件中的文本:从相同的Perl正则表达式捕获多个匹配?

hello mayank1 kumar mayank21 
yadav Kevin has at most 
K 
K minutes to perform this operations. He decides mayank3 that the string is super mayank4 
if it is the lexicographically 
smallest among all possible strings mayank15 
that he can get. Your task is to help Kevin and 
find this mayank2 lexicographically mayank8 smallest string mayank9 

我怎样才能找到所有mayank<number>

我想:

use strict; 

open(FH, "testfile.txt") or die "Can't open file for reading."; 
while (my $line = <FH>) { 
    chomp($line); 
    while ($line =~ /(mayank.*?)/g) { 
     print "$1\n"; 
    } 
} 

即给予:

mayank 
mayank 
mayank 
mayank 
mayank 
mayank 
mayank 
mayank 

使用:

while ($line =~ /(mayank.?)/g) { 
    print "$1\n"; 
} 

我得到

mayank1 
mayank2 
mayank3 
mayank4 
mayank1 
mayank2 
mayank8 
mayank9 

请建议。

+1

你是什么意思找到所有“mayank”?你期望你的程序产生什么输出? – redneb

+0

对不起,不完整的,我寻找热塑成型为O/P为: mayank1 \ n mayank21 \ n mayank3 \ n mayank4 \ n mayank15 \ n mayank2 \ n mayank8 \ n mayank9 \ n – Mayank

+0

我刚编辑该帖子(改进后的格式),并注意到所需的结果未被反引号包围,所以我们看不到'maya '中的''部分。 – PerlDuck

回答

5

如果你想捕捉mayank后跟一个数字,你可以使用下面的正则表达式:

while ($line =~ /(mayank\d*)/g) { 
    print "$1\n"; 
} 

如果号码是强制性的,将其更改为/(mayank\d+)/

短解释\d匹配单个数字,以便\d*尽可能多的位数为可能的(但至少一个)的匹配,而多的数字作为可能的(或零,如果是没有的),并\d+匹配。

为什么你的解决方案,没有工作

/(mayank.*?)/使用非贪婪的量词(*?),它尝试匹配的小人物成为可能,所以没有什么。
/(mayank.?)/将捕获mayank(即使是空格)之后的任何字符,如果有的话。

+0

谢谢,它的工作,并感谢解释。 – Mayank

0

你想捕捉mayank#ID其中ID是一个数字或全无:

$line =~ /(mayank)(\d+)?/ 
  • $ 1:将持有mayank
  • $ 2:将持有编号或将为空(undef)

您可能会发现关于用Perl阅读本手册的正则表达式的更多信息:

man perlre 
+1

几乎;-)考虑一个包含'mayank'(没有数字)的行。 '$ line =〜/(mayank)(\ d +)?/ g'会将'$ 1'作为'mayank'和'$ 2'作为'undef'。另一方面,'$ line =〜/(mayank)(\ d *)/ g'会将'$ 1'作为''''(空字符串)作为'mayank'和'$ 2'接收。当你打印“$ 1 - $ 2 \ n”时出现差异:':第一个解决方案抱怨'$ 2'未被定义,而第二个只打印空字符串。 “空”和“undef”在Perl中是两个不同的东西(不仅在Perl中)。 – PerlDuck

+0

通常我使用修改语句:如果$ 1和$ 2打印“$ 1 - $ 2 \ n”;避免警告。我同意使用(\ d *)将强制空匹配,因此将$ 2设置为“”(空字符串)。 –