在Ruby中,如何删除字符串中的所有字符,直到子字符串匹配为止?

在Ruby中,如何删除字符串中的所有字符,直到子字符串匹配为止?,ruby,regex,string,Ruby,Regex,String,假设我有一个字符串:嘿,怎么了@dude,@最近怎么样? 我想删除@how's使用之前的所有字符 或者使用正则表达式: str = "Hey what's up @dude, @how's it going?" str.gsub!(/.*?(?=@how)/im, "") #=> "@how's it going?" 您可以在上阅读有关环视的内容,工作正常,但会因ArgumentError(参数错误)而爆炸:如果指针不在草堆中,则范围值不正确 在这种情况下,使用或可能更有效: s.par

假设我有一个字符串:
嘿,怎么了@dude,@最近怎么样?

我想删除
@how's

使用之前的所有字符

或者使用正则表达式:

str = "Hey what's up @dude, @how's it going?"
str.gsub!(/.*?(?=@how)/im, "") #=> "@how's it going?"
您可以在

上阅读有关环视的内容,工作正常,但会因ArgumentError(参数错误)而爆炸:如果指针不在草堆中,则范围值不正确

在这种情况下,使用或可能更有效:

s.partition "@how's"
# => ["Hey what's up @dude, ", "@how's", " it going?"]
s.partition "not there"
# => ["Hey what's up @dude, @how's it going?", "", ""]
s.rpartition "not there"
# => ["", "", "Hey what's up @dude, @how's it going?"]
不区分大小写

>> "Hey what's up @dude, @HoW's it going?".partition(/@how's/i)[-2..-1].join
=> "@HoW's it going?"
或者使用
scan()


这是一种只获取您感兴趣的零件的简单方法

>> s="Hey what's up @dude, @how's it going?"
=> "Hey what's up @dude, @how's it going?"
>> s[/@how.*$/i]
=> "@how's it going?"

如果确实需要更改字符串对象,您可以始终执行
s=s[…]

您也可以直接调用字符串上的
[]
(与
切片
相同)


实际上有几十种方法可以做到这一点。以下是我将使用的:

如果要保留原始字符串

str = "Hey what's up @dude, @how's it going?"
str2 = str[/@how's.+/mi]
p str, str2
#=> "Hey what's up @dude, @how's it going?"
#=> "@how's it going?"
str = "Hey what's up @dude, @how's it going?"
str[/\A.+?(?=@how's)/mi] = ''
p str
#=> "@how's it going?"
如果要对原始字符串进行变异,请执行以下操作:

str = "Hey what's up @dude, @how's it going?"
str2 = str[/@how's.+/mi]
p str, str2
#=> "Hey what's up @dude, @how's it going?"
#=> "@how's it going?"
str = "Hey what's up @dude, @how's it going?"
str[/\A.+?(?=@how's)/mi] = ''
p str
#=> "@how's it going?"
……或者

str = "Hey what's up @dude, @how's it going?"
str.sub! /\A.+?(?=@how's)/mi, ''
p str
#=> "@how's it going?"
您需要将
\A
锚定在字符串的开头,并使用
m
标志确保跨多行匹配

也许最简单的一种方法是对原始基因进行变异:

str = "Hey what's up @dude, @how's it going?"
str.replace str[/@how's.+/mi]
p str
#=> "@how's it going?"

+我很干净。不过,指数不是很低吗?是不是应该是
0..s.index(“@how”)
?他想在赛前把所有东西都脱光,这和说“赛后保留所有东西”一样。哎呀,我误解了拼接的工作原理。我认为它在适当的位置删除了字符串,就像删除方法一样。我没有意识到它返回了拼接文本以供使用。我在下面对另一个答案进行了评论,但我想知道,既然它在任何情况下都可能是@how(例如@how、@how、@how等)的变体,那么它是否可以这样做:str.slice(str.index(@[Hh][Oo Ww]”)如果搜索字符串没有出现,
索引将返回
nil
。因此,在执行
切片之前,他应该检查
nil
,或者计划挽救将
nil
索引传递到
slice
时产生的错误。考虑到它在任何情况下都可能是@how(例如@how、@how、@how等)的变体,可以这样做:str.gsub(/.*(?=[Hh][Oo Ww])/,“”)当然,固定的。(/i已添加)无需
gsub
sub可以,对吗?另外请注意(根据我的回答),如果字符串在要匹配的文本之前有换行符,则需要
\A
锚定和/或
m
标志。谢谢!对不起,我不知道gsub和sub之间的区别。你能解释一下吗?SuuUper很老,你现在很可能已经知道了区别,但是如果看到n00bs的答案发生变化,那就太好了:gsub会在第一场比赛结束后进行全局搜索和替换,而sub会停止。gsub可能会导致意外结果或性能不佳,因为字符串较长。您需要在最后一个正则表达式上设置
m
标志,以匹配后面可能出现的任何换行符。
str = "Hey what's up @dude, @how's it going?"
str.sub! /\A.+?(?=@how's)/mi, ''
p str
#=> "@how's it going?"
str = "Hey what's up @dude, @how's it going?"
str.replace str[/@how's.+/mi]
p str
#=> "@how's it going?"