正则表达式,用于提取括号中的逗号分隔数字


Regex for extracting comma delimited numbers in brackets

字符串:

lorem ipsum 999
[id:284,286]
[id:28]

括号中的块可能包含很多数字。

正则表达式:

'[id:('d+)(,'d+)*']

我希望看到的:

284
286
28

使用 PHP 的解决方案:

preg_match_all('/'[id:(.*)']/', $input, $ids);
if (strpos($ids[1][0], ',')) {
    $ids = explode(',', $ids[1][0]);
    foreach ($ids as $id) {
        echo $id . "'n";
    }
} else {
    echo $ids[1][0];
}

但是是否可以使用没有 explode() 的正则表达式?

explode的方式也许是最好的。不幸的是,PCRE 不记得重复的组,因此,您要么分 2 步(使用 explode ),要么使用基于 'G 的正则表达式。这是一个比你正在使用的正则表达式更安全的正则表达式(如果数字之间没有空格):

$input = "lorem ipsum 999 [id:284,286] [id:28]"; 
preg_match_all('~'[id:(['d,]*)]~', $input, $ids);
foreach ($ids[1] as $id) {
    print_r(explode(',', $id)) . PHP_EOL;
}

查看 IDEONE 演示

'~'[id:(['d,]*)]~'正则表达式匹配[id:然后匹配并捕获到组 1 中零个或多个(由于 0+ 出现量词*)数字 ( 'd ) 或 , s。

如果您需要一个正则表达式解决方案,在 PHP 中,如果您处理单个字符串,您可以使用基于 'G 的正则表达式,您可以利用它来设置前导边界,然后匹配连续的数字:

'~(?:'[id:|(?!^)'G,)'K'd+~'

请参阅正则表达式演示和此 IDEONE 演示:

$re = '~(?:'[id:|(?!^)'G,)'K'd+~'; 
$strs = array("lorem ipsum 999", "[id:284,286]", "[id:28]"); 
foreach ($strs as $s) {
    preg_match_all($re, $s, $matches);
    print_r($matches[0]);
}

图案详情

  • (?:'[id:|(?!^)'G,) - 将[id:文字字符序列或每个成功匹配的结尾与后面带有逗号的(?!^)'G匹配
  • 'K - 省略匹配的值
  • 'd+ - 仅匹配 1+ 位数字

如果数字之间可能有空格,请在逗号之后(也许在逗号之前)添加's*