2010-12-19 58 views
3

我有一些麻煩做飯了,產生這種結果的正則表達式:正則表達式:如何「退一步」

邁克,米莎1,2,米格爾1,2,3,4 ,5,6,7,18和Michea 2,3

如何退後一步在正則表達式中拋棄最後一場比賽?這是我需要一個逗號之前的空間不匹配。這是我想出了...

\d+(,|\r) 

邁克1,米莎1,2,米格爾1,2,3,4,5,6,7,18,和邁克爾2,3

回答

2

你問的關於正則表達式的特性叫做positive lookbehind。但就你而言,我不認爲你需要它。試試這個:

\d+(?:,\d+)* 

在你的榜樣,這將匹配數字的逗號分隔列表和排除的名稱和尾隨逗號和空格。

下面是測試代碼的短位用PHP編寫的用於驗證它在你輸入:

<?php 
$input = "Mike1, misha1,2, miguel1,2,3,4,5,6,7,18, and Micheal2,3"; 
$matches = array(); 
preg_match_all('/\d+(?:,\d+)*/', $input, $matches); 
print_r($matches[0]); 
?> 

輸出:

Array 
(
    [0] => 1 
    [1] => 1,2 
    [2] => 1,2,3,4,5,6,7,18 
    [3] => 2,3 
) 
0

我相信\d+,(?!\s)會做你想要什麼。 ?!negative lookahead,只有在?!之後出現而不是纔出現在搜索字符串中的這個位置。

>>> re.findall(r'\d+,(?!\s)', 'Mike1, misha1,2, miguel1,2,3,4,5,6,7,18, and Michea2,3') 
['1,', '1,', '2,', '3,', '4,', '5,', '6,', '7,', '2,'] 

或者,如果你想匹配不包括最後一個逗號使用\d+(?:,\d+)*號的逗號分隔的列表。

>>> re.findall(r'\d+(?:,\d+)*', 'Mike1, misha1,2, miguel1,2,3,4,5,6,7,18, and Michea2,3') 
['1', '1,2', '1,2,3,4,5,6,7,18', '2,3'] 
+0

「\ d +,(?!\ s)」似乎不起作用,但無論如何感謝。 – Mikhail 2010-12-19 21:49:34