如何使用preg_match_all分割包含数字的字符串


how to split a string containing numbers in our outside parenthesis using preg_match_all

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

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

between()的文本总是在字符串的末尾(至少现在是这样)。

我需要把它分割成一个类似这样的数组:

[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,但我仍然得到一些不需要的元素。

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

-?'d+(?:'s+-?'d+)*匹配一个可选的-, 1个或多个数字,然后匹配由1+空格组成的0+序列,后跟可选的-和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                                                                                                                                             
    )                                                                                                                                                            

您可以在preg_match_all:

中使用此正则表达式。
$re = '/'d+(?=[^()]*[()])/';

RegEx演示

RegEx分手:

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