Ruby의 문자열에서 특정 문자를 삭제하는 방법은 무엇입니까?


82

다음과 같은 여러 문자열이 있습니다.

"((String1))"

그들은 모두 길이가 다릅니다. 루프의 모든 문자열에서 괄호를 어떻게 제거 할 수 있습니까?


2
괄호를 제거하거나 "무작위"문자열에서 처음 두 문자와 마지막 두 문자를 제거 하시겠습니까? (실제로 무작위입니까?)
Monica 복원-notmaynard

"((String1))"[2 ...- 2] # => "String1"
Monica 복원


많은 문자열을 변경하기 위해 루프를 요청하고 있는데, 문자열은 어떻게 저장됩니까?
hirolau

난 그냥 문자열 조작 부분을 원 모든 문자열을 통해 루프를 만드는 방법을 알고, 미안 내가 이상한 말로
크리스티아누

답변:


165

다음을 사용하여 다음을 수행하십시오 String#tr.

 "((String1))".tr('()', '')
 # => "String1"

7
파괴적인 버전도있다 tr!처럼, 자리에서 문자열을 수정합니다my_string.tr!(')(','')
bonh

8
이 함수는 처음부터 끝까지 잘라내는 것이 아니라 문자열 내의 모든 텍스트를 완전히 대체합니다.
Jordan

3
오해의 소지가 있고 부정확합니다. Tr은 트리밍 기능이 아니라 대체 기능입니다. 이 둘은 매우 다른 작업입니다.
Zane Claes

1
@ZaneClaes 예. OP는 실제로 OP가 원하는 것을 설명하기 위해 잘못된 용어를 사용했습니다. 대답은 출력을 얻는 방법을 보여주었습니다.
Arup Rakshit

39

처음 두 문자와 마지막 두 문자 만 제거 하려면 문자열에 음수 인덱스 를 사용할 수 있습니다 .

s = "((String1))"
s = s[2...-2]
p s # => "String1"

문자열에서 모든 괄호를 제거 하려면 문자열 클래스 에서 delete 메서드를 사용할 수 있습니다 .

s = "((String1))"
s.delete! '()'
p s #  => "String1"

8
이것은 (겉보기에) OP가 원하는 것이 아닌 문자열의 중간에있는 괄호도 모두 삭제합니다. 그것이 원하는 것이라면 이것이 가장 우아한 솔루션입니다.
분석 재개 모니카 - notmaynard

20

String#gsub정규 표현식과 함께 사용 :

"((String1))".gsub(/^\(+|\)+$/, '')
# => "String1"
"(((((( parentheses )))".gsub(/^\(+|\)+$/, '')
# => " parentheses "

이렇게하면 주변 괄호 만 제거됩니다.

"(((((( This (is) string )))".gsub(/^\(+|\)+$/, '')
# => " This (is) string "

2
두 번째 예의 경우 +1 (둘러싸는 괄호 만 제거).
Bhavneet Singh Bajwa

20

사람들이 건너오고 성능을 찾고 들어, 모양 #delete#tr2-4X보다 빠른 속도에서 같은 약이다 gsub.

text = "Here is a string with / some forwa/rd slashes"
tr = Benchmark.measure { 10000.times { text.tr('/', '') } }
# tr.total => 0.01
delete = Benchmark.measure { 10000.times { text.delete('/') } }
# delete.total => 0.01
gsub = Benchmark.measure { 10000.times { text.gsub('/', '') } }
# gsub.total => 0.02 - 0.04

3
4 년 후 ... :-) 벤치마킹을 몇 자릿수 (1_000_000 회 실행)까지 올리면 위에서 사용한 것과 동일한 코드를 사용하면 삭제가 tr보다 약간 빠르게 실행되고 삭제는 약 tr의 0.92 비율과 삭제의 1.5x보다 약간 작은 gsub (실제로 삭제의 ~ 1.46, tr의 ~ 1.39). 물론 ymmv. 이것은 2018 MBP 13의 Ruby 2.6.3입니다.이 세 가지 방법을 벤치마킹 해 주셔서 감사합니다!
likethesky

1

이를 달성하는 더 짧은 방법은 다음과 같습니다.

1) 사용 Negative character class pattern matching

irb(main)> "((String1))"[/[^()]+/]
=> "String1"

^-캐릭터 클래스에없는 항목과 일치합니다. charachter 클래스 내부에서, 우리가 (하고)

또는 다른 사람들이 언급 한 것처럼 전역 대체 "AKA : gsub"를 사용합니다.

irb(main)> "((String1))".gsub(/[)(]/, '')
=> "String1"

귀하의 두 답변은 ((a))b. 첫 a번째는 돌아오고 두 번째는 돌아올 것입니다ab
Ulysse BN
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.