2011-05-11 225 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