根据空格和括号从字符串中提取单词

时间:2019-08-02 06:05:40

标签: regex go split

我有一些字符串,这些字符串与用空格分隔的单词相对应,并且可以使用括号进行分组。我也有一个字符串数组,它们表示字符串中存在的组(不一定以相同的顺序)。

这里是一个示例:

myString = "zzz AND (aaa AND (bbb AND ccc OR ddd) ) OR eee AND \"fff  fff\" AND (ggg)"
myGroups = ["(ggg)", "(aaa AND (bbb AND ccc OR ddd) )"]

我想将该查询拆分为不在引号内和括号内的空格。上一个字符串的拆分结果如下:

["zzz", "AND", "(aaa AND (bbb AND ccc OR ddd) )", "OR", "eee", "AND", "\"fff  fff\"", "AND", "(ggg)"]

我使用正则表达式成功地将引号内的空格分割了

\s(?=(?:[^'"`]*(['"`])[^'"`]*\1)*[^'"`]*$)

但是我很难在其中添加组的概念。

注意:

  • myString可能包含嵌套的组,但我只想在外部的一个上进行分组
  • 无需处理括号语法错误的情况

2 个答案:

答案 0 :(得分:1)

// PHP 
$re = '/(\((([^()]*|(?1))*)\))|(\\\\"[^\\\\]+\\\\"|[^\s]+)/m';
$str = 'zzz AND (aaa AND (bbb AND ccc OR ddd) ) OR eee AND \\"fff  fff\\" AND (ggg)';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
$result = array_column($matches, 0);
print_r($result);

// output
Array
(
    [0] => zzz
    [1] => AND
    [2] => (aaa AND (bbb AND ccc OR ddd) )
    [3] => OR
    [4] => eee
    [5] => AND
    [6] => \"fff  fff\"
    [7] => AND
    [8] => (ggg)
)

Regex Demo

答案 1 :(得分:0)

([\w]*)*?(?:(\([\w ]+(?2)*\))(?2)*)*?(\"[\w ]+\")?

Demo

相关问题