如何使用Ruby从字符串中删除特定字符后的子字符串?

40

如何使用Ruby删除字符串中特定字符之后的子字符串?


1
我相信标题已经足够自我解释了。另外,我大约13小时前接受了Jacob的答案,请给其他人一些时间;通常人们不会一直刷新同一页并等待答案。 - JayX
2
修改标题并不是为了让您受益,而是为了让其他人寻找同样问题的答案时受益。如果您的问题看起来毫无用处,没有人会为您的问题点赞,这反而会对您造成损失。这只是我的个人看法。 - aarona
2
这个问题没有解释子字符串的长度,所以非常模糊。显然,您希望子字符串从某个特定字符的第一个实例之后立即开始,并一直延伸到主字符串的结尾。不要期望我们能够读懂您的心思。另一个心灵感应者可能会问与您相同的问题,但要求不同的答案,因为她只想删除长度为1的子字符串。 - David Grayson
可能是重复问题(带有更好的答案):在Ruby中删除“@”符号及其后面的所有内容 - Jon Schneider
6个回答

49
new_str = str.slice(0..(str.index('blah')))

alt text


1
如果你想要到达分隔符的结尾:new_str = str.slice(0..(str.index('blah') + 'blah'.length)) - mvndaai
4
如果在字符串中找不到给定的字符会发生什么? - Mauricio Gracia Gutierrez
如果未找到字符,则会抛出异常ArgumentError:范围值错误。 - yaru

34

我发现"Part1?Part2".split('?')[0]更易于阅读。


3
但是,如果你想要加回问号,那么你就需要再添加它,因此我不认为这回答了你确切的问题。 - Ivan -Oats- Storck
我喜欢这个答案,因为你不需要检查是否存在“?”号,它也适用于任何其他字符串而不会抛出异常。 - 0lli.rocks

13

我很惊讶没有人建议使用'gsub'

irb> "truncate".gsub(/a.*/, 'a')
=> "trunca"

使用 gsub 的感叹号版本可以修改字符串。


1
你是不是指的是 /(?<=a).*/ 或者 /a\K.*/,以排除匹配到的 "a" - Cary Swoveland
@CarySwoveland 没错,要么这样做,要么重新引入 char。好发现。 - philant

5

如果您有多个相同字符的出现,并且希望从最后一次出现到结尾删除(而不是第一个), 那么这就是一个特殊情况。 按照Jacob的建议,您只需使用rindex而不是index,因为rindex获取字符串中字符的索引,但是从末尾开始。 像这样:

str = '/path/to/some_file'
puts str.slice(0, str.index('/')) # => ""
puts str.slice(0, str.rindex('/')) # => "/path/to"

5
str = "Hello World"
stopchar = 'W'
str.sub /#{stopchar}.+/, stopchar
#=> "Hello W"

0

我们也可以使用partitionrpartition,具体取决于我们想要使用指定字符的第一个还是最后一个实例:

string = "abc-123-xyz"
last_char = "-"

string.partition(last_char)[0..1].join   #=> "abc-"
string.rpartition(last_char)[0..1].join   #=> "abc-123-"

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