Regex匹配父组中重复的组

问题描述 投票:0回答:1

我试图将多个分组匹配到另一个分组下。

输入

182507 { 6661(T) }, 182514 { 5551(T), 5553(T), 5552(T) }

输出

Full match: 182507 { 6661(T) }
Group 1: 182507
Group 2: 6661(T)

Full match: 182514 { 5551(T), 5553(T), 5552(T) }
Group 1: 182514
Group 2: 5551(T)
Group 3: 5553(T)
Group 4: 5552(T)

我尝试过该模式,但似乎无法正常工作,但我除外

/([0-9]+)\s*\{\s*(\s*[0-9]+\s*\(\s*[A-Z]+\s*\))\s*?(?:,*\s*([0-9]+\s*\(\s*[A-Z]+\s*\))\s*)*+\s*\}+/

非常感谢

php regex preg-match-all
1个回答
0
投票

您的问题是重复捕获组仅捕获该组的最后一个匹配项,因此您的正则表达式未捕获字符串第二部分中的5553(T)。使用两步方法进行此操作可能更简单,首先是匹配数字,然后是{}中的部分,然后将第二部分拆分为各个部分:

$string = '182507 { 6661(T) }, 182514 { 5551(T), 5553(T), 5552(T) }';
preg_match_all('/(\d+)\s*{\s*([^}]+)\s*}/', $string, $matches);
$output = array();
foreach ($matches[1] as $key => $value) {
    $output[$key] = array_merge(array($value), preg_split('/\s*,\s*/', $matches[2][$key]));
}
print_r($output);

输出:

Array
(
    [0] => Array
        (
            [0] => 182507
            [1] => 6661(T) 
        )
    [1] => Array
        (
            [0] => 182514
            [1] => 5551(T)
            [2] => 5553(T)
            [3] => 5552(T) 
        )
)

Demo on 3v4l.org

© www.soinside.com 2019 - 2024. All rights reserved.