2011-05-11 269 views
8

如何將字符串從字符分割字符串

str = "20050451100_9253629709-2-2" 

I need the output 
["20110504151100_9253629709-2", "2"] 
+1

根據您接受的答案,好像你是願意接受分裂最終連字符,而不是嚴格的第二位。你應該確保在你的數據中,第二個總是最後的。 – Kelvin 2011-07-26 17:17:00

回答

4

你可以使用正則表達式匹配:

str = "20050451100_9253629709-2-2" 
m = str.match /(.+)-(\d+)/ 
[m[1], m[2]] # => ["20050451100_9253629709-2", "2"] 

將R中文表達式匹配「任何」,後面跟着一個破折號,後面跟着數字。

+0

謝謝@hallidave。我認爲,這在性能方面是最好的。 – 2011-05-11 13:32:31

+0

這個答案是相當古老的,但有人可以描述或鏈接字符串匹配的語法? – 2015-10-31 16:01:31

4

第二次出現分裂。如果你總是有兩個連字符,你可以得到-的最後一個索引:

str = "20050451100_9253629709-2-2" 
last_index = str.rindex('-') 

# initialize the array to hold the two strings 
arr = [] 

# get the string characters from the beginning up to the hyphen 
arr[0] = str[0..last_index] 
# get the string characters after the hyphen to the end of the string 
arr[1] = str[last_index+1..str.length] 
3
"20050451100_9253629709-2-2"[/^([^-]*\-[^-]*)\-(.*)$/] 
[$1, $2] # => ["20050451100_9253629709-2", "2"] 

這將匹配任何字符串,將其拆分第二次出現-

+0

+1這一個實際使用第二次出現,而不是最後一次。你可以這樣更簡潔:'str.match(/^([^-]*\-[^-]*)\-(.*)$/)。to_a [1 ..- 1]' – Kelvin 2011-07-26 17:23:10

2

你可以分開拆分並重新聯合起來回:

str = "20050451100_9253629709-2-2" 
a = str.split('-') 
[a[0..1].join('-'), a[2..-1].join('-')] 
9

有沒有像一個一行:)

str.reverse.split('-', 2).collect(&:reverse).reverse 

這將扭轉串,由分裂「 - 」一次,因此返回2個元素(在第一個' - '前面的東西以及它後面的所有東西),然後反轉這兩個元素,然後是數組本身。

編輯

*before, after = str.split('-') 
puts [before.join('-'), after] 
+0

謝謝@gnab。在這裏,你正在做很長的過程..我需要非常簡短的過程 – 2011-05-11 13:33:33

+1

事實上,我只是試圖避免不可讀的正則表達式,恕我直言,這是一種矯枉過正的這個相當簡單的問題。我用一個雙線的替代方案更新了我的答案。 – gnab 2011-05-12 08:08:19

+0

對我來說,在所有其他方面是最好的答案。 – Aleks 2017-04-06 12:37:22