我有一個文本正文我正在尋找拉出4位數字的重複集。正則表達式:匹配單詞內的4位數字
例如:
首先是1234 2)第二個是2098 3)第三個是3213
現在我知道我能得到第一組數字出通過簡單地使用:
/\d{4}/
...返回1234
但我怎麼匹配第二組數字,或第三組,等等......?
編輯:我如何返回2098,或者3213
我有一個文本正文我正在尋找拉出4位數字的重複集。正則表達式:匹配單詞內的4位數字
例如:
首先是1234 2)第二個是2098 3)第三個是3213
現在我知道我能得到第一組數字出通過簡單地使用:
/\d{4}/
...返回1234
但我怎麼匹配第二組數字,或第三組,等等......?
編輯:我如何返回2098,或者3213
見http://perldoc.perl.org/perlre.html供討論使用g修飾符的,這將導致你的正則表達式匹配的模式的所有occurrances,不只是第一個。
我正在使用只接受正則表達式作爲函數的一部分的系統,它只需要第一次匹配,並且不允許使用修飾符(如'g')。我會尋找一種語法,可以說「給我第二個\ d {4} \匹配。不知道我是否有意義。 –
你正在使用的函數的文檔說關於匹配多個副本 –
如果正則表達式僅匹配一次,然後在匹配正則表達式一個所有三種,並使用匹配組提取它們:
^.*\b(\d{4})\b.*\b(\d{4})\b.*\b(\d{4})\b.*$
三個4位數字將在組1 2和3被捕獲。
如果您希望找到$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//
。
啊,可怕的雙反斜槓Protip:使用正則表達式引用'qr //'然後:'qr/^(?:。*?\ b(\ d {4} )\ b){$ n}/x' – amon
您的問題似乎還沒有得到正確的答案。
解決方法是在您的正則表達式上使用/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
模式的正則表達式,使其只匹配整個四位數字,並且不,例如,發現1234567
1234
。 /x
修飾符只允許我添加空格,以便模式更易理解。
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";
你用什麼語言? –
Hi Rohit。我正在使用Perl。我的錯誤,我認爲所有正則表達式都是一樣的。 –
爲了記錄,正則表達式有幾種「方言」,每種方言都有自己的一組支持功能。例如,JavaScript中的RegExp不支持由Perl風格的正則表達式支持的負面後顧。 –