2010-12-19 57 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