Regex 基于空格和括号从字符串中提取单词

Regex 基于空格和括号从字符串中提取单词,regex,go,split,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) )"] 我想在不在引号内和括号内的空格上拆分该查询。上一个字符串的拆分

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

以下是一个例子:

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
    可能包含嵌套组,但我只想在外部组上拆分
  • 不需要处理括号语法错误的情况
//PHP
$re='/(\((([^()]*(?1))*))\(\\\“[^\\\]+\\\\”[^\s]+)/m';
$str='zzz和(aaa和(bbb和ccc或ddd))或eee和\“fff fff\\”和(ggg)';
预匹配全部($re,$str,$matches,预设置顺序,0);
$result=array\u列($matches,0);
打印(结果);
//输出
排列
(
[0]=>zzz
[1] =>和
[2] =>(aaa和(bbb和ccc或ddd))
[3] =>或
[4] =>eee
[5] =>和
[6] =>\“fff fff\”
[7] =>和
[8] =>(ggg)
)


您是在什么环境下实现此功能的?我正在使用Golang执行此操作,但任何类型的解决方案都可以,我可以调整:)您的
mString
输入有未替换的双引号,我怀疑您是否会编译(任何语言)。除此之外,您正在处理嵌套内容,可能应该使用解析器,而不是正则表达式。在字符串的一次传递中,您可以生成结果,您需要一个列表来保存已处理的单词,一个缓冲区来添加字符,直到您到达一个空格,以及两个计数器,当您到达
)时,这些计数器将递增/递减
,对于第二个带有
。只有当两个计数器都为零时,才将空格视为实分隔符,如果它们不为零,则应将空格视为普通字母,并应附加到char的缓冲区中,在此时到达分隔符之前,请重置缓冲区并将单词添加到保存的单词列表中。您的正则表达式在Go中无法工作,因为它的正则表达式不支持lookarounds。你不能用一个正则表达式来解决它。使用Allan的逻辑。虽然这段代码可以回答这个问题,但提供关于为什么和/或这段代码如何回答这个问题的额外上下文可以提高其长期价值。嗨,我不明白你说的。你能写得简单一点吗?我的英语不是很好。
([\w]*)*?(?:(\([\w ]+(?2)*\))(?2)*)*?(\"[\w ]+\")?