Answers:
您可以使用slice方法:
a = "foobar"
a.slice! "foo"
=> "foo"
a
=> "bar"
有一个非“!” 版本。在其他版本的文档中也可以找到更多信息:http : //www.ruby-doc.org/core/classes/String.html#method-i-slice-21
"foobar".tap{|s| s.slice!("foo")}.upcase
delete
不起作用,因为它会删除您传入的所有字符:'hello world'.delete('hello') #=> ' wrd'
如何str.gsub("subString", "")
查看Ruby Doc
sub
会比更为合适gsub
,因为OP只想从字符串的开头而不是整个字符串中删除子字符串(请看他的示例代码)。像这样使用正则表达式会更好:str.sub(/^subString/, '')
-因为它确保绝对仅从开始就删除子字符串。
subString
是否不包含任何正则表达式特殊字符,这将很危险。
/^subString/
是一个文字,因此我们可以确定它不包含任何元字符。如果要将其他字符串替换为正则表达式,则可以执行以下操作:/#{Regexp.escape(str)}/
。
Regexp.escape()
。
如果它是字符串的结尾,则也可以使用chomp
:
"hello".chomp("llo") #=> "he"
chomp
与reverse
以下内容结合使用:"hello".reverse.chomp("he".reverse).reverse #=> "llo"
如果只有一次出现目标字符串,则可以使用:
str[target] = ''
要么
str.sub(target, '')
如果您多次使用目标:
str.gsub(target, '')
例如:
asdf = 'foo bar'
asdf['bar'] = ''
asdf #=> "foo "
asdf = 'foo bar'
asdf.sub('bar', '') #=> "foo "
asdf = asdf + asdf #=> "foo barfoo bar"
asdf.gsub('bar', '') #=> "foo foo "
如果你需要做的就地替换使用"!"
的版本gsub!
和sub!
。
asdf['bar'] = ''
slice
方法没有返回被切开的字符串的一部分,而是返回了“刀”
slice!
def gimme_the_slice(my_string, my_slice) my_string.slice!(my_slice) my_string
如果您的子字符串位于字符串末尾的开头,则Ruby 2.5引入了用于此目的的方法:
如果您使用的是rails或在不太活跃的支持下获得String#remove和String#remove!方法
def remove!(*patterns)
patterns.each do |pattern|
gsub! pattern, ""
end
self
end
来源:http : //api.rubyonrails.org/classes/String.html#method-i-remove
如果我的解释正确,那么这个问题似乎是在字符串之间要求减号(-)运算,即内置加号(+)运算(串联)的反义。
与前面的答案不同,我试图定义一个必须遵循属性的操作:
如果c = a + b然后c-a = b AND c-b = a
我们只需要三个内置的Ruby方法即可实现此目的:
'abracadabra'.partition('abra').values_at(0,2).join == 'cadabra'
。
我不会解释它是如何工作的,因为一次运行一个方法很容易理解。
这是概念证明代码:
# minus_string.rb
class String
def -(str)
partition(str).values_at(0,2).join
end
end
# Add the following code and issue 'ruby minus_string.rb' in the console to test
require 'minitest/autorun'
class MinusString_Test < MiniTest::Test
A,B,C='abra','cadabra','abracadabra'
def test_C_eq_A_plus_B
assert C == A + B
end
def test_C_minus_A_eq_B
assert C - A == B
end
def test_C_minus_B_eq_A
assert C - B == A
end
end
如果您使用的是最新的Ruby版本(> = 2.0),请多多提建议:使用优化而不是上一个示例中的猴子补丁String。
就像这样简单:
module MinusString
refine String do
def -(str)
partition(str).values_at(0,2).join
end
end
end
并using MinusString
在需要的位置之前添加。
这就是我要做的
2.2.1 :015 > class String; def remove!(start_index, end_index) (end_index - start_index + 1).times{ self.slice! start_index }; self end; end;
2.2.1 :016 > "idliketodeleteHEREallthewaytoHEREplease".remove! 14, 32
=> "idliketodeleteplease"
2.2.1 :017 > ":)".remove! 1,1
=> ":"
2.2.1 :018 > "ohnoe!".remove! 2,4
=> "oh!"
格式化为多行:
class String
def remove!(start_index, end_index)
(end_index - start_index + 1).times{ self.slice! start_index }
self
end
end
def replaceslug
slug = "" + name
@replacements = [
[ "," , ""],
[ "\\?" , ""],
[ " " , "-"],
[ "'" , "-"],
[ "Ç" , "c"],
[ "Ş" , "s"],
[ "İ" , "i"],
[ "I" , "i"],
[ "Ü" , "u"],
[ "Ö" , "o"],
[ "Ğ" , "g"],
[ "ç" , "c"],
[ "ş" , "s"],
[ "ı" , "i"],
[ "ü" , "u"],
[ "ö" , "o"],
[ "ğ" , "g"],
]
@replacements.each do |pair|
slug.gsub!(pair[0], pair[1])
end
self.slug = slug.downcase
end
Ö
。
[]
s用于非爆炸版本。