【问题标题】:Extract words from string based on spaces and parenthesis根据空格和括号从字符串中提取单词
【发布时间】:2019-12-10 17:52:00
【问题描述】:

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

这是一个例子:

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 可能包含嵌套组,但我只想拆分外部组
  • 不需要处理括号语法错误的情况

【问题讨论】:

  • 你在什么环境下实现这个?
  • 我正在用 Golang 做这个,但是任何一种解决方案都可以,我可以适应 :)
  • 您的mString 输入有未转义的双引号,我怀疑甚至会编译(以任何语言)。除此之外,您正在处理嵌套内容,并且可能应该使用解析器,而不是正则表达式。
  • 单次传递字符串,您可以生成结果,您需要一个列表来保存处理过的单词,一个缓冲区来添加字符直到到达一个空格和 2 个计数器,当您在您到达(),第二个到达""。仅当两个计数器都为零时,才将空格视为真正的分隔符,如果它们不为零,则应将空格视为普通字母并应附加到 char 的缓冲区中,直到此时到达分隔符时才重置缓冲区并将该单词添加到已保存单词列表中。
  • 你的正则表达式在 Go 中不起作用,因为它的正则表达式不支持环视。你不能用一个正则表达式来解决它。使用艾伦的逻辑。

标签: regex go split


【解决方案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

【讨论】:

    【解决方案2】:
    ([\w]*)*?(?:(\([\w ]+(?2)*\))(?2)*)*?(\"[\w ]+\")?
    

    Demo

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关 why 和/或 如何 此代码回答问题的附加上下文可提高其长期价值.
    • 嗨,我没听懂你说的。你能写得简单一点吗?我的英语不是很好。
    猜你喜欢
    • 1970-01-01
    • 2016-04-21
    • 2019-08-10
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多