3

我在编写产生此结果的正则表达式时遇到了一些麻烦:

迈克1,米莎1,2,米格尔1,2,3,4,5,6,7,18和米凯2,3

如何在正则表达式中退后一步并丢弃最后一个匹配项?那就是我在空格前需要一个逗号才能不匹配。这是我想出的...

\d+(,|\r)

迈克1,米莎1,2,米格尔1,2,3,4,5,6,7,18和迈克尔2,3

4

2 回答 2

2

您要询问的 regex 功能称为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
)
于 2010-12-19T21:32:48.660 回答
0

我相信\d+,(?!\s)会做你想做的。The?!是一个否定的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']
于 2010-12-19T21:35:33.810 回答