답변:
슬라이스 방법을 사용할 수 있습니다.
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", "")
밖으로 확인 루비 문서를
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'] = ''
Rails를 사용하는 경우도 있습니다 remove
.
예를 들어 "Testmessage".remove("message")
수율 "Test"
.
경고 :이 방법은 모든 발생을 제거 합니다
slice
슬라이스있어 문자열의 일부를 반환하지 않는 방법, 그것은 "칼"을 반환
slice!
def gimme_the_slice(my_string, my_slice) my_string.slice!(my_slice) my_string
만약 당신의 하위 문자열이 문자열의 시작 부분에 있다면, Ruby 2.5는이를위한 방법을 도입했습니다 :
레일을 사용하거나 덜 활동적인 지원을 받으면 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
내가 올바르게 해석한다면,이 질문은 문자열 사이의 마이너스 (-) 연산, 즉 내장 플러스 (+) 연산 (연결)의 반대와 같은 것을 요구하는 것 같습니다.
이전 답변과 달리 속성을 준수 해야하는 작업을 정의하려고합니다.
IF c = a + b THEN 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)을 사용하는 경우 마지막 조언 : 이전 예제와 같이 원숭이 패치 문자열 대신 구체화 를 사용 하십시오.
다음과 같이 쉽습니다.
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를 사용할 수도 있습니다 .