【问题标题】:split by comma inside braces except another braces inside braces大括号内用逗号分隔,大括号内的另一个大括号除外
【发布时间】:2017-06-01 12:07:48
【问题描述】:

我想用大括号内的逗号分隔,除了大括号内的另一个大括号

$q1 ="CREATE TABLE notes(id INTEGER,code DECIMAL (4,2),PRIMARY KEY (id))";
$q2 ="CREATE TABLE notes(id INTEGER,code TEXT)";

$r = preg_split('/\([^()]*\)(*SKIP)(*F)|[()]|,/', $q1);//$q1 splitted but $q2 no
print_r($r);

最终结果应该是:

$q1:

   array(
         0 => id INTEGER
         1 => code DECIMAL (4,2)
         2 => PRIMARY KEY (id)
   );

$q2:

   array(
        0 => id INTEGER
        1 => code TEXT
   );

【问题讨论】:

  • 没有人能够回答您的问题。太模糊了。
  • 我想在大括号内拆分 sql ......仅此而已!
  • 您的问题不清楚... AFAIK,您需要用逗号分隔此字符串,但code DECIMAL (4,2) 保持不变?
  • 是的,我想保持原样......
  • 这个问题可能与...*.com/questions/15233953/…

标签: php preg-match preg-match-all preg-split


【解决方案1】:

代码:(PHP Demo)

$sqls = array(
    "CREATE TABLE notes(id INTEGER,code DECIMAL (4,2),PRIMARY KEY (id))",
    "CREATE TABLE notes(id INTEGER,code TEXT)"
);

foreach($sqls as $sql){
    if(preg_match_all("/(?:^.+?\(|,)(?:\K[\w ]+(?:\([\S].*?\))?)/", $sql,$matches)){
        echo "<pre>";
            var_export($matches[0]);
        echo "</pre>";
    }
}

输出:

// first $matches...
array(
    0 => 'id INTEGER',
    1 => 'code DECIMAL (4,2)',
    2 => 'PRIMARY KEY (id)'
)
// second $matches...
array(
    0 => 'id INTEGER',
    1 => 'code TEXT'
)

正则表达式分解:(Regex Demo)

(?:^.+?\(|,)          #group everything from the start to 1st parenthesis or a comma
(?:\K[\w ]+           #\K means "only retain text from this point", group words and spaces
    (?:\([\S].*?\))?  #optionally group parenthetical text
)

使用\K 允许排除捕获组,preg_match_all 在第一个子数组中返回所需的字符串(完整字符串)。好处是$matches 数组的大小是带有捕获组的数组的一半。

【讨论】:

  • @edd 如果我的回答满意,请给它打绿勾。否则,请给我留言,说明有待修复的问题。
【解决方案2】:

如果嵌入的括号仅包含数字,则可以这样做:

$sqls = array(
"CREATE TABLE notes(id INTEGER,code DECIMAL (4,2),PRIMARY KEY (id))",
"CREATE TABLE notes(id INTEGER,code TEXT)"
);

foreach ($sqls as $sql) {
    $arr = preg_split("/(?<!\d)[(),](?!\d)/", $sql);
    print_r($arr);
}

输出:

Array
(
    [0] => CREATE TABLE notes
    [1] => id INTEGER
    [2] => code DECIMAL (4,2)
    [3] => PRIMARY KEY 
    [4] => id
    [5] => 
    [6] => 
)
Array
(
    [0] => CREATE TABLE notes
    [1] => id INTEGER
    [2] => code TEXT
    [3] => 
)

【讨论】:

  • 你离这个想法更近了
  • 这是一个部分答案,但我尝试适应这个想法(如果你有更好的想法......我等)
最近更新 更多