我有一个类似"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
并获得了结果,但是我不认为应该这样。我希望能有一些正则表达式来实现这一目标。有谁可以帮助我吗?
答案 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'