用下划线分隔字符串

时间:2019-01-15 09:35:44

标签: ruby

我有一个类似"a_b_c""a_b_c_d""a_b_c_d_e"的字符串。我想在最后一个下划线处分割字符串。

**input**
'a_b_c'
**output**
a_b
c

**input**
'a_b_c_d'
**output**
a_b_c
d

我已经执行以下操作:

a='a_b_c'
a=a.split('_')
last=a.pop
a.delete(last)
p a.join("_")
p last

并获得了结果,但是我不认为应该这样。我希望能有一些正则表达式来实现这一目标。有谁可以帮助我吗?

6 个答案:

答案 0 :(得分:7)

您可以使用String#rpartition在字符串的右端搜索给定的模式,并在找到它时拆分。

'a_b_c_d_e'.rpartition(/_/)
=> ["a_b_c_d", "_", "e"]

s = 'a_b_c_d_e'
parts = s.rpartition(/_/)
[parts.first, parts.last]
=> ["a_b_c_d", "e"]

编辑:根据评论应用建议:

'a_b_c_d_e'.rpartition('_').values_at(0,2)
=> ["a_b_c_d", "e"]

答案 1 :(得分:2)

您真的需要拆分吗?仅用空格替换int怎么样?例如使用rindex[]=

_

我没有进行基准测试,但是a[a.rindex('_')] = ' ' 创建了一个新的数组,该数组通常需要更多的资源,至少使用其他语言。

编辑:在对问题进行编辑后,现在可以清楚地看到OP正在请求列表而不是字符串输出

答案 2 :(得分:2)

使用正则表达式将其分割:

a.split(/_(?=[^_]+$)/)

说明:

  

将字符_与正的Lookahead匹配(?= [^ _] + $)

     

匹配[^ _] +以下列表中不存在的单个字符,并   $在字符串末尾或在字符串末尾的行终止符之前(如果有的话)声明位置

答案 3 :(得分:2)

您还可以获取以下值,

> a = a.split('_')
> a[0..-2].join('_')
# => "a_b_c_d" 
> a[-1]
# => "e" 

答案 4 :(得分:2)

const foo = { "currency": "dollar" };
const bar = "currency"

// will check if foo.bar exists
if (foo.hasOwnProperty(bar)) {/* do something */}

否定前瞻'a_b_c_d_e'.split /_(?!.*_)/ #=> ["a_b_c_d", "e"] 要求在下划线匹配之后,字符串中没有其他下划线。

答案 5 :(得分:-1)

假设您知道此字符串遵循以下格式:

str = 'a_b_c_d_e'
# Remainder
str[0...-2]    # -> 'a_b_c_d'

# Last symbol
str[-1]        # -> 'e'