2013-02-05 34 views
0

我有一個字符串:拆分複雜的字符串與正則表達式

(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'.. , ..'也應該是完整的字段)之外,所有字段都以逗號分隔。

+1

所以,你達到了最終目標。爲什麼不相關的第一步? –

+0

yikes對不起,不得不在會議前快速輸入這個問題。糾正。 – LetMeSOThat4U

+1

您已經提取了N個字段,現在您可以將它們變成類似X的東西,它們用逗號分隔並用您的N字段替換X。這不是解決方案,但工作。 – Kaeros

回答

0

您已經提取了N個字段,現在您可以將它們變成類似X的東西,它們用逗號分隔,並用您的N字段替換X。這不是解決方案,但工作。

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

除了使用lazy +,還可以使用否定字符類。它不會導致正則表達式引擎回溯,從而在生產環境中更快。 given_string.scan(/(?:(?:N'[^'] *')| [^,])+ /) –

+0

@akashspeaking正確。我想你的意思是非貪婪的'*?',而不是懶惰的'+'。 – sawa

+0

對不起。我的意思是一個懶惰的*。它被交替地引用。 –

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

注意:這是一種可正確處理加倍撇號的唯一解決方案。

+0

這看起來像一個很好的解決方案,因爲CSV文件非常難以解析。顯示一些輸出以確認它的工作。 –

+0

謝謝@ theTinMan - 我終於明白了。 –

+0

+1。很好,很乾淨。 –

相關問題