2013-08-24 81 views
7

我有一個文本正文我正在尋找拉出4位數字的重複集。正則表達式:匹配單詞內的4位數字

例如:

首先是1234 2)第二個是2098 3)第三個是3213

現在我知道我能得到第一組數字出通過簡單地使用:

/\d{4}/ 

...返回1234

但我怎麼匹配第二組數字,或第三組,等等......?

編輯:我如何返回2098,或者3213

+7

你用什麼語言? –

+1

Hi Rohit。我正在使用Perl。我的錯誤,我認爲所有正則表達式都是一樣的。 –

+2

爲了記錄,正則表達式有幾種「方言」,每種方言都有自己的一組支持功能。例如,JavaScript中的RegExp不支持由Perl風格的正則表達式支持的負面後顧。 –

回答

1

http://perldoc.perl.org/perlre.html供討論使用g修飾符的,這將導致你的正則表達式匹配的模式的所有occurrances,不只是第一個。

+0

我正在使用只接受正則表達式作爲函數的一部分的系統,它只需要第一次匹配,並且不允許使用修飾符(如'g')。我會尋找一種語法,可以說「給我第二個\ d {4} \匹配。不知道我是否有意義。 –

+2

你正在使用的函數的文檔說關於匹配多個副本 –

0

如果正則表達式僅匹配一次,然後在匹配正則表達式一個所有三種,並使用匹配組提取它們:

^.*\b(\d{4})\b.*\b(\d{4})\b.*\b(\d{4})\b.*$ 

三個4位數字將在組1 2和3被捕獲。

+1

我認爲這會導致OP的例子出現問題,因爲源代碼包含「1」和「2」,這就是'\ D +'測試失敗的原因 – ajb

+0

@ajb好的點 - 你說得對,現在怎麼樣? – Bohemian

+1

是的,這應該會更好。\ \ b是其他人和我正在使用的方法,但是如果OP想從1234中提取出1234InTheMiddleOfAWord,那麼我們需要一些不同的東西我們並不知道他的具體要求 – ajb

1

如果您希望找到$n「個4位數組的模式,這似乎工作:

$pat = "^(?:.*?\\b(\\d{4})\\b){$n}"; 
if ($s =~ /$pat/) { 
    print "Found $1\n"; 
} else { 
    print "Not found\n"; 
} 

我通過構建一個字符串模式,因爲我不能讓一個VA這樣做riable插入量詞{$n}

此模式找到位於單詞邊界上的4位數組(\b測試);我不知道這是否符合您的要求。該模式使用.*?來確保儘可能少的字符在每個四位組之間匹配。該模式匹配$n次,並且捕獲組$1被設置爲最後一次迭代中的值,即第$n次。

編輯:當我只是再試一次,它似乎插入量詞的$n就好了。我不知道我做了什麼不同,上次沒有奏效。因此,也許這將工作:

if ($s =~ /^(?:.*?\b(\d{4}\b){$n}/) { ... 

如果不是看到阿蒙的評論關於qr//

+1

啊,可怕的雙反斜槓Protip:使用正則表達式引用'qr //'然後:'qr/^(?:。*?\ b(\ d {4} )\ b){$ n}/x' – amon

11

您的問題似乎還沒有得到正確的答案。

解決方法是在您的正則表達式上使用/g修飾符。在列表上下文中會發現在你的字符串的數字所有一次,這樣

my $str = 'The first is 1234 2) The Second is 2098 3) The Third is 3213'; 

my @numbers = $str =~ /\b \d{4} \b/gx; 

print "@numbers\n"; 

輸出

1234 2098 3213 

或者你可以遍歷它們,在while使用標量上下文循環,像這樣

while ($str =~ /\b (\d{4}) \b/gx) { 
    my $number = $1; 
    print $number, "\n"; 
} 

輸出

1234 
2098 
3213 

我已經加入了\b模式的正則表達式,使其只匹配整個四位數字,並且不,例如,發現12345671234/x修飾符只允許我添加空格,以便模式更易理解。

0

Ajb用「gx」的答案是最好的。如果你知道你會有三個號碼,這條直線就行:

my $str = 'The first is 1234 2) The Second is 2098 3) The Third is 3213'; 
my ($num1, $num2, $num3) = $str =~ /\b \d{4} \b/gx; 
print "$num1, $num2, $num3\n"; 
相關問題