正则表达:如何“退后一步”

时间:2010-12-19 21:29:11

标签: regex adobe-indesign

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

Mike 1 ,misha 1,2 ,miguel 1,2,3,4,5,6,7,18 ,以及Michea的 2,3

如何退回正则表达式并丢弃最后一场比赛?那就是我需要一个逗号才能找到不匹配的空格。这就是我想出来的......

\d+(,|\r)

Mike 1, misha 1,2, miguel 1,2,3,4,5,6,7,18,和迈克尔的 2,3

2 个答案:

答案 0 :(得分: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
)

答案 1 :(得分:0)

我相信\d+,(?!\s)会做你想做的事。 ?!negative lookahead,仅在?!后面的内容 not 出现在搜索字符串中的此位置时才匹配。

>>> 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']