用正则表达式拆分复杂的字符串

时间:2013-02-05 12:14:45

标签: ruby regex

我有一个字符串:

(3592, -1, 7, N'SUNWopensp-root', N'1.5,REV=10.0.3.2004.12.15.14.19', N'Sun Microsystems, Inc.', N'The OpenJade Group''s SGML and XML parsing tools - platfowrm independent files, / filesystem', N'SunPackage', abc, 83)

我需要在逗号上拆分它,但不要在N'...'子串中分开。

我设法用以下内容提取N' ... '字符串的所有内容:

N\'(.*?)(?:\',|\)|\'\))

但是这不会在逗号"3592, -1, 7"等上分开,而我不能单独分开逗号,因为它会用逗号分隔N' ... '个字符串。最终目标是将所有字段用逗号分隔除N' ... '个字符串中的字符(即N'.. , ..'也应该是完整的字段)。

3 个答案:

答案 0 :(得分:1)

given_string.scan(/(?:(?:N'.*?')|[^,])+/)

给出:

[
  "(3592",
  " -1",
  " 7",
  " N'SUNWopensp-root'",
  " N'1.5,REV=10.0.3.2004.12.15.14.19'",
  " N'Sun Microsystems, Inc.'",
  " N'The OpenJade Group''s SGML and XML parsing tools - platfowrm independent files",
  " / filesystem'",
  " N'SunPackage'",
  " abc",
  " 83)"
]

这看起来不寻常,因为它包含空格和括号,并且单词中的'字符用作字段N'...'的分隔符,但由于这是问题中提到的,这是我给的是什么如果这不是你想要的,那就归咎于这个问题的邋。。

答案 1 :(得分:1)

由于接近CSV格式,这是解析它的一种方法。

#remove parens and N's
csv = str.gsub(/^\(|\)$/, "").gsub(/, N/, ",")

CSV.parse_line(csv, {:quote_char => "'"})

输出:

[
 "3592",
 " -1",
 " 7",
 "SUNWopensp-root",
 "1.5,REV=10.0.3.2004.12.15.14.19",
 "Sun Microsystems, Inc.",
 "The OpenJade Group's SGML and XML parsing tools - platfowrm independent files,
 / filesystem",
 "SunPackage",
 " abc",
 " 83"
]

注意:这是正确处理双重撇号的唯一解决方案。

答案 2 :(得分:0)

你已经提取了N'个字段,现在你可以将它们变成类似X的东西,用逗号分割它们并用你的N'字段替换X.这不是解决方案,但有效。