从第二个字符出现的位置开始分割字符串

11

如何从第二次出现的字符开始拆分字符串

str = "20050451100_9253629709-2-2"

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

1
根据您接受的答案,似乎您愿意以最后一个连字符为分割点,而不是严格地以第二个连字符为分割点。您应该确保在数据中,第二个连字符总是最后一个。 - Kelvin
6个回答

11

没有什么比一行代码更好了 :)

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

这将会反转字符串并且只按照'-'分割一次,因此返回2个元素(第一个'-'前面的内容和其后面所有的内容)。然后再反转这两个元素以及整个数组。

编辑

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

感谢@gnab。在这里,您正在执行非常长的过程.. 我需要一个非常简短的过程。 - Mr. Black
1
事实上,我只是想避免难以理解的正则表达式,因为在这个相对简单的问题中,它们有点过度设计。我用两行代码更新了我的答案,提供了另一种选择。 - gnab
在我看来,这是所有答案中最好的一个。 - Aleks

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]

4
你可以使用正则表达式匹配:
str = "20050451100_9253629709-2-2"
m = str.match /(.+)-(\d+)/
[m[1], m[2]]  # => ["20050451100_9253629709-2", "2"]

正则表达式匹配“任何东西”,后面跟着一个破折号和数字。

感谢@hallidave。我认为,就性能而言,这是最好的选择。 - Mr. Black
这个回答很旧了,但是有人能描述或链接字符串匹配的语法吗? - Krzysztof Kraszewski

3
"20050451100_9253629709-2-2"[/^([^-]*\-[^-]*)\-(.*)$/]
[$1, $2] # => ["20050451100_9253629709-2", "2"]

这将匹配任何字符串,并通过第二个-字符进行分割。


+1 这个实际上使用的是第二次出现而不是最后一次。你可以通过这种方式使它更加简洁:str.match(/^([^-]*\-[^-]*)\-(.*)$/).to_a[1..-1] - Kelvin

2
您可以将其拆分并重新组合:
str = "20050451100_9253629709-2-2"
a = str.split('-')
[a[0..1].join('-'), a[2..-1].join('-')]

0
string.gsub(/^[^-]+-[^-]+-/,'')
  1. ^表示开头
  2. [^-]表示除了破折号以外的单个字符
  3. [^-]+表示一个或多个除了破折号以外的单个字符
  4. -表示破折号
  5. [^-]+-表示上述内容的重复
  6. 使用gsub函数删除与该模式匹配的字符

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接