我有一个字符串,看起来像这样:
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