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

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

这里是一个示例:</ p>

  myString =“ zzz AND(aaa AND(baa AND ccc OR ddd))OR eee AND \  “ fff fff \” AND(ggg)“ 
myGroups = [”(ggg)“,”(aaa AND(bbb AND ccc OR ddd))“]
</ code> </ pre>

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

  [“ zzz”,“ AND”,“(aaa AND(bbb AND ccc OR ddd))”  ,“ OR”,“ eee”,“ AND”,“ \” fff fff \“”,“ AND”,“(ggg)”] 
</ code> </ pre>

I 使用正则表达式</ p>

  \ s(?=(?:[^'“] *(['”])[  ^'“] * \ 1)* [^'”] * $)
</ code> </ pre>

但是我很难在其中添加组的概念。< / p>

注意:</ p>


  • myString </ code>可能包含嵌套组,但我只想在外部拆分 </ li>
  • 无需处理括号语法错误的情况</ li>
    </ ul>
    </ div>

展开原文

原文

I have some strings that correspond to words separated by spaces and that can be grouped using parenthesis. I also have an array of strings that represent the groups present in the string (not necessarily in the same order).

Here is an example :

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) )"]

I want to split that query on spaces that are not inside quotes and that are not inside parenthesis. The output of the split on the previous string would be as follow :

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

I succeeded to split on spaces that are not inside quotes using the regex

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

But I am struggling with adding the notion of groups in this.

Note :

  • myString may contain nested groups, but I only want to split on the outer one
  • No need to handle cases where parenthesis syntax is wrong

doukang7858
doukang7858 您的regex无法在Go中使用,因为其regexp不支持环视。您无法使用单个正则表达式解决它。使用艾伦的逻辑。
大约一年之前 回复
douchengchen7959
douchengchen7959 我正在努力,但是您比我快。谢谢!
大约一年之前 回复
dongqi9125
dongqi9125 只需一次传递字符串就可以生成结果,您需要一个列表来保存处理过的单词,一个缓冲区来添加字符,直到到达一个空格为止;还有两个计数器,当达到(或)时会递增/递减,对于第二个带有“,”。仅当两个计数器都为零时,才将空格视为真正的分隔符,如果它们都不为零,则应将空格视为普通字母,并应将其附加到char缓冲区中,直到此时到达分隔符,然后重置缓冲区并将单词添加到已保存单词列表中。
大约一年之前 回复
doulu8847
doulu8847 是的,我编辑了字符串。我会看看没有正则表达式怎么办,谢谢
大约一年之前 回复
dpi9530
dpi9530 您的mString输入未转义双引号,并且我怀疑甚至可以编译(使用任何语言)。除此之外,您正在处理嵌套的内容,可能应该使用解析器而不是正则表达式。
大约一年之前 回复
duanjiao1256
duanjiao1256 我正在用Golang做到这一点,但是任何一种解决方案都可以,我可以适应:)
大约一年之前 回复
dtoqemais553654797
dtoqemais553654797 您在什么环境中实现此功能?
大约一年之前 回复

2个回答

// 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

douwen7516
douwen7516 太棒了! 这真的很好:)
大约一年之前 回复



 ([\ w] ?(?:(\([\ w] +(?2)*  \))(?2)*)*?(\“ [\ w] + \”)?
</ code> </ pre>

演示 </ p>
</ div>

展开原文

原文

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

Demo

dsgrgaz321973284
dsgrgaz321973284 嗨,我不明白你说什么。 你能写点简单吗? 我的英语不太好。
大约一年之前 回复
dongluxin2452
dongluxin2452 尽管此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的其他上下文,可以提高其长期价值。
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐