正则表达式在字符上拆分字符串,不包含在()中

时间:2009-02-18 22:14:30

标签: regex

我正在尝试将字符串拆分为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`
)

关于如何解决这个问题的任何想法?

- 戴夫

4 个答案:

答案 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

请记住,如果您的某个地方有),或者您有多个需要解析的括号,那么这将会失败。