如何使用preg_match_all在我们的外括号中拆分包含数字的字符串

时间:2016-09-28 21:11:05

标签: php regex preg-match-all

我有一个看起来像这样的字符串:

535354 345356 3543674 34667 2345347 -3536 4532452 (234536 2345634 -4513453) (2345 -13254 13545)

()之间的文本总是在字符串的末尾(至少目前为止)。

我需要将其拆分为类似于此的数组:

[0] => [0] 535354,345356,3543674,34667,2345347,-3536,4532452
[1] => [0] 234536,2345634,-4513453
    => [1] 2345,-13254,13545

我应该为preg_match_all使用什么表达式? 我能用有限的知识得到的最好的是/([0-9]{1,}){1,}.*(?=(\(.*\)))/U,但我仍然会得到一些不需要的元素。

2 个答案:

答案 0 :(得分:0)

您可以在preg_match_all中使用此正则表达式:

$re = '/\d+(?=[^()]*[()])/';

RegEx Demo

RegEx分手:

\d+       # match 1 or more digits
(?=       # lookahead start
   [^()]* # match anything but ( or )
   [()]   # match ( or )
)         # lookahead end

答案 1 :(得分:0)

你可以使用一个正则表达式来匹配括号外的数字块和"~(?<=\()\s*$numrx\s*(?=\))|\s*$numrx~"里面的数字,其中$numrx代表数字正则表达式(可以进一步增强)。

-?\d+(?:\s+-?\d+)*匹配可选的-,1位或更多位数,然后是0 + 1+个空格的序列,后跟可选的-和1+位数。 (?<=\()\s*$numrx\s*(?=\))仅在前面加(后跟)匹配时才匹配。

请参阅此PHP代码段:

$s = "535354 345356 3543674 34667 2345347 -3536 4532452 (234536 2345634 -4513453) (2345 -13254 13545)";
$numrx = "-?\d+(?:\s+-?\d+)*";
preg_match_all("~(?<=\()\s*$numrx\s*(?=\))|\s*$numrx~", $s, $m);
$res = array();
foreach ($m[0] as $k) {
    array_push($res,explode(" ",trim($k)));
}
print_r($res);

输出:

[0] => Array                                                                                                                                                     
    (                                                                                                                                                            
        [0] => 535354                                                                                                                                            
        [1] => 345356                                                                                                                                            
        [2] => 3543674                                                                                                                                           
        [3] => 34667                                                                                                                                             
        [4] => 2345347                                                                                                                                           
        [5] => -3536                                                                                                                                             
        [6] => 4532452                                                                                                                                           
    )                                                                                                                                                            

[1] => Array                                                                                                                                                     
    (                                                                                                                                                            
        [0] => 234536  
        [1] => 2345634                                                                                                                                           
        [2] => -4513453                                                                                                                                          
    )                                                                                                                                                            

[2] => Array                                                                                                                                                     
    (                                                                                                                                                            
        [0] => 2345                                                                                                                                              
        [1] => -13254                                                                                                                                            
        [2] => 13545                                                                                                                                             
    )