2016-09-11 43 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設置爲「」(空字符串)。 –