我正在尝试将字符串拆分为a,其中该字符未包含在()中。
示例字符串:
`table1`.`lname`,`table1`.`fname`,if(foo is not null,foo,if(bar is not null,bar,table3.baz)),`table3`.`shu`
我想把它拆分成一个看起来像
的数组(
0=>`table1`.`lname`
1=>`table1`.`fname`
2=>if(foo is not null,foo,if(bar is not null,bar,table3.baz))
3=>`table3`.`shu`
)
关于如何解决这个问题的任何想法?
- 戴夫
答案 0 :(得分:4)
一般情况下,你不能用正则表达式来做。您通常需要一个递归后代解析器(或类似的东西)来匹配可能嵌套到任意深度的括号。
我认为之前有类似的问题,但我很难找到它们。 This answer但是应该有助于解释。
答案 1 :(得分:0)
我会查看您最喜欢的语言,看看是否有用于处理CSV文件的特定模块。 Ruby在最近版本中有CSV(替换为FasterCSV),可以很好地处理您的问题。
它比单个正则表达式更复杂,但可以完成工作。
Perl有this Parse::CSV个模块。
答案 2 :(得分:0)
正则表达并不是很擅长这一点。请考虑以下代码段:
(一)B(C(d)E)
每个字母代表一个逗号(您的搜索目标)。根据您的问题,您只想匹配逗号b
。诀窍是表达式通常是贪婪或不贪婪,没有中间立场。
一个贪婪的表达式会在细分的最开始看到(
,在最后看到)
并在其中看到所有,无论是否关闭其他地方的括号。 没有什么会匹配。
从开头开始,一个不同意的表达式只会采用最小的表达式。它会匹配逗号b
,但也会将此细分视为一个单元:(c(d)
然后继续匹配逗号e
。
有一些引擎可以让你计算嵌套级别,但是表达式通常很难看并且难以维护:除非你真的理解它,否则最好避免使用该功能。
答案 3 :(得分:0)
如果你知道你只会收到一个一对括号,那么这可能会有效:
/(([^,]*\(.*\))|[^,]*)/g
请记住,如果您的某个地方有)
,或者您有多个需要解析的括号,那么这将会失败。