在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?"