2010-10-01 36 views
27

我試圖拆分String。簡單的例子工作:Grails:拆分包含管道的字符串

groovy:000> print "abc,def".split(","); 
[abc, def]===> null 
groovy:000> 

但是,而不是逗號,我需要把它拆分的管道,我沒有得到期望的結果:

groovy:000> print "abc|def".split("|"); 
[, a, b, c, |, d, e, f]===> null 
groovy:000> 

所以,當然,我的第一選擇將是從管道(|)切換爲逗號(,)作爲分隔符。

但現在我很好奇:爲什麼這不起作用?逃離管(\|)似乎並沒有幫助:

groovy:000> print "abc|def".split("\|"); 
ERROR org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed, groovysh_parse: 1: unexpected char: '\' @ line 1, column 24. 
    print "abcdef".split("\|"); 
         ^

1 error 
| 
     at java_lang_Runnable$run.call (Unknown Source) 
groovy:000> 

回答

53

你需要拆就\\|

+0

你能提供一個例子嗎?它與我提供的最後一個代碼段不一樣嗎? – Tom 2010-10-01 19:50:26

+0

@Tom,這是一個格式問題,他的意思是\ \ |'。你需要轉義'\'來讓它在字符串中解釋,所以它可以轉義'|' – 2010-10-01 19:51:36

+0

@Colin非常感謝。沒有發現格式問題。我很抱歉。 – Tom 2010-10-01 19:55:20

17

你必須逃避管道,事實上,它在正則表達式中有特殊的含義。但是,如果您使用引號,則還必須跳過斜線。基本上,兩個選項則:

asserts "abc|def".split("\\|") == ['abc','def'] 

或使用/作爲字符串分隔符,以避免額外的逃逸

asserts "abc|def".split(/\|/) == ['abc','def'] 
+0

謝謝!對於解釋和正確格式化的演示,'/ /似乎是熟練而熟悉的:) – Tom 2010-10-01 19:55:53

+0

+1。我不知道爲什麼其他答案會獲得所有的愛,這個更好。 – 2013-02-22 23:32:40