모든 공백을 제거하는 루비 기능?


573

모든 공백 을 제거하는 Ruby 기능은 무엇입니까 ? PHP와 같은 것을 찾고 trim()있습니까?


36
귀하의 질문이 분명하지 않습니다 : 모든 공백을 제거 하시겠습니까? 또는 앞뒤 공백을 제거 하시겠습니까?
Sinan Ünür

25
PHP는 trim()공백을 " 문자열의 시작과 끝에서 "( 문서에 명시된대로 ) 제거하지만 "모든 공백"을 제거하지는 않습니다.
Tadeck

3
의심스러운 경우 String 클래스에 대한 Ruby 온라인 설명서를 참조하십시오 (아래 .strip 참조).
Merovex

2
사용 String#strip하거나 일치 하는 모든 답변 /\s+/은 ASCII 공백 만 제거합니다. ASCII가 아닌 공백도 캡처하려면 (예 : HTML &nbsp) @EBooker의 이상한 대답을 참조하십시오.
MatzFan

1
그러한 위대한 응답이 받아 들여질 수없는 것이 유감입니다
New Alexandria

답변:


846

PHP의 트림과 같이 선행 및 후행 공백 만 제거하려면을 사용할 수 .strip있지만 모든 공백 을 제거 하려면 .gsub(/\s+/, "")대신 을 사용할 수 있습니다 .


5
"/ \ s + /"는 공백을 의미합니까?
Rails 초보자

54
\ s +는 하나 이상의 공백 문자 (공백, 줄 바꿈, 탭)를 의미합니다. // 주변은 정규식임을 보여줍니다.
dylanfm

3
이것은 trim ()과 동일하지 않습니다
Brett Holt

6
strip은 내가 찾던 것입니다. 좋은 질문과 천막에 감사드립니다!
Francois

15
@BrettHolt gsub 표현식은 trim과 동일하지 않지만 질문자는 "all whitespace"라는 문구를 포함했는데 이는 trim과 동일하지 않습니다. 그래서 나는 대안을 주었다.
joel.neely

494
s = "I have white space".delete(' ')

그리고 PHP의 trim()기능 을 에뮬레이트하려면 :

s = "   I have leading and trailing white space   ".strip

12
이것은 정규식보다 훨씬 더 읽기 쉽습니다. 왜 인기가 없습니까?
ckarbass

89
@ckarbass : 많은 사람들이 간단한 문제에 대해 지나치게 복잡한 솔루션을 선호하기 때문에. 경험이 없어집니다.
Ed S.

97
@ckarbass @Ed S. 동일하지 않기 때문에 인기가 없습니다. 원래 질문에는 탭, 줄 바꿈 등이 포함 된 "모든 공백"이라는 문구가 사용되었습니다.이 제안 된 답변은 다른 공백 문자를 제거하지 않습니다. "과도하게 복잡한"에 대해서는 간단한 정규식을과 비교하는 것이 좋습니다.이 표현 .delete(' ').delete('\t').delete('\n') ...은 지나치게 장황하며 오타와 누락 오류에 대한 많은 기회를 제공합니다.
joel.neely

13
@ joel.neely : 오래 전에이 질문에 대답했지만 이번에는 더 신중하게 질문을 다시 읽으십시오. OP는 "모든 공백을 제거하는 함수" 를 요청했지만 "PHP의 trim ()"과 같은 것을 요청했습니다 . 그래서 그들이 원하는 것을 정확히 아는 것은 조금 어렵습니다. trim()줄 바꿈 및 기타 공백 문자를 제거하지는 않습니다. 모호한 질문에 대한 하나의 해석을 선택하고 있습니다.
Ed S.

4
@는 joel.neely : 그건 내가 질문의 문자 적 해석을 넘어 솔루션이 경우 더 나은 한 점에 동의했다 (즉, 공백 오히려 캐릭터에 비해 구성하는 모든 문자를 제거하는 정규식 delete()전화를.)
Ed S.

163

관련 답변 :

"   clean up my edges    ".strip

보고

"clean up my edges"

그게 내가 잊어 버린 것입니다. 인수가 전달되지 않으면 기본적으로 공백을 제거하는 방법이 있다는 것을 알았습니다. +1
Ed S.

트림과 같습니다. 위의 @Tadeck의 인용문을 참조하십시오.
Brett Holt

3
변수가 nil일 가능성이있는 .to_s경우 strip 메소드가 오류를 일으키지 않도록 strip 을 실행 하기 전에 method를 실행 하십시오 . 전의. str=nil; str.to_s.strip #=> ""
scarver2

some_data.strip을 선호합니다! 만약 some_data.is_a? 끈
slindsey3000

156

String#strip -시작과 끝에서 모든 공백을 제거하십시오.

String#lstrip -처음부터.

String#rstrip -끝에서.

String#chomp(인수없이)- 끝에서 줄 구분 기호 ( \n또는 \r\n)를 삭제합니다 .

String#chop -마지막 문자를 삭제합니다.

String#delete-- x.delete(" \t\r\n")나열된 모든 공백을 삭제합니다.

String#gsub- 유니 코드x.gsub(/[[:space:]]/, '') 공백을 포함하여 모든 공백을 제거 합니다 .


참고 : 위의 모든 메소드는 원본을 변경하지 않고 새 문자열을 반환합니다. 문자열을 제자리에서 변경 !하려면 끝에 해당 메소드를 호출하십시오 .


String # delete 예제는 정규식을 사용하는 것으로 보이지만 \s슬래시 대신 따옴표로 묶습니다. 또한 문서에서 delete가 정규 표현식을 인수로 사용할 수 있다는 언급을 찾을 수 없습니다.
slothbear

@slothbear는 정규 표현식이 아니며 정규 표현식과 유사한 패턴의 작은 집합입니다. 설명서 #delete는와 비슷하게 작동한다고합니다 #count. 콘솔에서도 시도해 볼 수 있습니다.
ndnenkov

새로운 것을 가르쳐 주셔서 감사합니다. 또한 가능한 한 가장 작은 상황 (명령 행)으로 시도해 보도록 상기시켜 주셔서 감사합니다.
slothbear

1
@SeinopSys 나는이 답변을 Ruby 만 유지하고 싶었습니다.
ndnenkov

2
이 답변의 마지막 예제만이 웹 스크레이퍼의 골칫거리 인 무서운 ASCII 160 '비 중단 공간'을 포착합니다. #strip하지 않습니다. stackoverflow.com/questions/4859438/…
MatzFan

95
"1232 23 2 23 232 232".delete(' ')
=> "123223223232232"

삭제 작업이 더 빠름 =)

user         system     total      real
gsub, s      0.180000   0.010000   0.190000 (0.193014)
gsub, s+     0.200000   0.000000   0.200000 (0.196408)
gsub, space  0.220000   0.000000   0.220000 (0.222711)
gsub, join   0.200000   0.000000   0.200000 (0.193478)
delete       0.040000   0.000000   0.040000 (0.045157)

1
그러나 이것은 모두를 제거 spaces하지는 않습니다white spaces
Gavriel

1
delete(" \t\r\n")일반적인 공백을 처리하고 여전히 gsub보다 빠릅니다.
세스 제프리

94

Rails / ActiveSupport 를 사용 squish하는 경우 메소드 를 사용할 수 있습니다 . 문자열의 양쪽 끝에서 공백을 제거하고 여러 공백을 단일 공백으로 그룹화합니다.

예를 들어.

" a  b  c ".squish

결과는 다음과 같습니다.

"a b c"

api.rubyonrails.org에서이 참조를 확인하십시오 .


4
참고 것을 링크 전용 답변 낙심, SO 응답 솔루션 (대 아직 시간이 지남에 따라 부패하는 경향 참조의 다른 경유지)에 대한 검색의 엔드 포인트이어야한다. 링크를 참조로 유지하면서 독립형 시놉시스를 여기에 추가하십시오.
kleopatra

2
나는이 대답이 충분히 설명되었다고 생각하고 그 대답 자체가 명확하기 때문에 링크가 참조 였다는 사실을 설명했다. 이 기능은 좋은 덕분
ksugiarto

4
이것은 ActiveSupport에서 온 것입니다. Rails를 모두 사용할 필요는 없지만 최소한 ActiveSupport와require 'active_support/core_ext/string/filters'
Justin Force

2
명확하게하기 위해이는 어떤 공백. 예"a \t \n \f \r \v b".squish == "a b"
Purplejacket

47

조금 늦었지만이 페이지를 탐색하는 다른 사람이이 버전에 관심이있을 수 있습니다.

사용자가 어떻게 든 앱에 잘라 붙여 넣을 수 있지만 미리 단어 간격을 유지하는 미리 서식이 지정된 텍스트 청크를 정리하려면 다음을 시도하십시오.

content = "      a big nasty          chunk of     something

that's been pasted                        from a webpage       or something        and looks 

like      this

"

content.gsub(/\s+/, " ").strip

#=> "a big nasty chunk of something that's been pasted from a webpage or something and looks like this"

33
하나는 레일 '사용할 수 있습니다 squish: 방법 apidock.com/rails/String/squish
필립 Koebbe

5
또는 Rails가없고 줄 바꿈이없는 경우 squeeze(" ")작동 할 수 있습니다.
Andrew Grimm

45

루비의 .strip메소드는 PHP와 같은 기능을 수행합니다 trim().

모든 공백을 제거하려면

"  leading    trailing   ".squeeze(' ').strip
=> "leading trailing"

@Tass는 내 원래 답변이 연속으로 중복 문자를 제거한다는 것을 알았습니다. 이후 Rails 프레임 워크를 사용하는 경우 그러한 발생에 대해 더 똑똑한 squish 메소드로 전환했습니다.

require 'active_support/all'
"  leading    trailing   ".squish
=> "leading trailing"

"  good    men   ".squish
=> "good men"

인용 : http://apidock.com/rails/String/squish


1
이렇게하면 "결합 된"중복 문자가 제거됩니다. "good men".squeeze.strip반환됩니다"god men"
Tass

1
@Tass를 지적 해 주셔서 감사합니다. squish 방법을 선호하여 답변을 편집했습니다.
scarver2

1
"연속 편지 중복"에 +1 시나리오를 설명하는 방법을 찾지 못했습니다. 잘 했어! :-)
Tass

26
" Raheem Shaik ".strip

왼쪽 및 오른쪽 공간을 제거합니다. 이 코드는 우리에게 다음을 줄 것입니다."Raheem Shaik"


20

또한 잊지 마십시오 :

$ s = "   I have white space   ".split
=> ["I", "have", "white", "space"]

6
따라서 s.split.join이 작업을 수행합니다.
Piotr Brudny 2012 년

1
반복 할 때 유용합니다.[" Hello World", "Big Giraffe "].map(&:split).map(&:join) #=> ["HelloWorld", "BigGiraffe"]
tbloncar

20

split.join 문자열의 모든 공간을 폭파합니다.

"  a b  c    d     ".split.join
> "abcd"

타이핑하고 기억하기가 쉽기 때문에 콘솔과 빠른 해킹에 좋습니다. 의도를 가리기 때문에 심각한 코드에서는 환영받지 못할 것입니다.

( 위 Justicle의 답변 에서 Piotr의 의견을 기반으로 함 )


1
이 의견에 많은 감사를드립니다 :-) 이것은 단락처럼 보이는 긴 문자열이있는 경우 작동하는 유일한 방법입니다.
Boomerange

12

당신은 이것을 시도 할 수 있습니다

"Some Special Text Values".gsub(/[[:space:]]+/, "")

using : space : 일반 공간과 함께 비 공백 공간을 제거합니다.


1
와일드 HTML &nbsp및 기타 비 ASCII 공백은에서 제거 하거나 일치 하지 않으므로 실제로 이것은 IMHO의 가장 좋은 대답 입니다. Regexp 문서 에서 "POSIX 괄호 표현식"섹션을 참조하십시오String#strip/\s/
MatzFan

8

gsub를 사용하거나 삭제하십시오. 차이점은 gsub가 탭을 제거 할 수 있지만 삭제는 할 수 없다는 것입니다. 때로는 편집기에서 추가 한 파일에 탭이 있습니다.

a = "\tI have some whitespaces.\t"
a.gsub!(/\s/, '')  #=>  "Ihavesomewhitespaces."
a.gsub!(/ /, '')   #=>  "\tIhavesomewhitespaces.\t"
a.delete!(" ")     #=>  "\tIhavesomewhitespaces.\t"
a.delete!("/\s/")  #=>  "\tIhavesomewhitespaces.\t"
a.delete!('/\s/')  #=>  using single quote is unexpected, and you'll get "\tI have ome whitepace.\t"

8

여러 가지 방법이 있습니다.
양쪽에서 공백을 제거하려면 :

PHP의 trim ()과 같은 종류

Foo_bar.strip

모든 공백을 제거하려면

Foo_bar.gsub(/ /, "")

모든 공백을 제거하려면

Foo_bar.gsub(/\s/, "")

6
"asd sda sda sd".gsub(' ', '')
=> "asdsdasdasd"

그러나 이것은 spaces모든 것을 제거 하지는 않습니다white spaces
Gavriel

6

gsub 방법은 잘 작동합니다.
gsub 메소드는 문자열에서 호출 할 수 있으며 다음과 같이 말합니다.

a = "this is a string"
a = a.gsub(" ","")
puts a
#Output: thisisastring

gsub 메소드는 첫 번째 인수가 발생할 때마다 검색하여 두 번째 인수로 바꿉니다. 이 경우 문자열 내의 모든 공간을 바꾸고 제거합니다.

또 다른 예:

b = "the white fox has a torn tail"

모든 문자 "t"를 대문자 "T"로 바꿉니다.

b = b.gsub("t","T")
puts b 
#Output: The whiTe fox has a Torn Tail

5

PHP trim와 정확히 일치하는 동작의 경우 가장 간단한 방법은 String#strip다음과 같이 해당 방법 을 사용하는 것입니다.

string = "  Many have tried; many have failed!    "
puts "Original [#{string}]:#{string.length}"
new_string = string.strip
puts "Updated  [#{new_string}]:#{new_string.length}"

루비에는 또한 위치 내 편집 버전 String.strip!(후미 '!')이 있습니다. 문자열 복사본을 만들 필요가 없으며 일부 용도에서는 훨씬 더 빠를 수 있습니다.

string = "  Many have tried; many have failed!    "
puts "Original [#{string}]:#{string.length}"
string.strip!
puts "Updated  [#{string}]:#{string.length}"

두 버전 모두이 출력을 생성합니다.

Original [  Many have tried; many have failed!    ]:40
Updated  [Many have tried; many have failed!]:34

나는 몇 가지 기본적인 용도의 성능을 테스트하는 벤치 마크를 생성 strip하고 strip!잘 어떤 대안과 같음. 테스트는 이렇습니다 :

require 'benchmark'

string = 'asdfghjkl'
Times = 25_000

a = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }
b = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }
c = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }
d = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }

puts RUBY_DESCRIPTION
puts "============================================================"
puts "Running tests for trimming strings"

Benchmark.bm(20) do |x|
  x.report("s.strip:")                 { a.each {|s| s = s.strip } }
  x.report("s.rstrip.lstrip:")         { a.each {|s| s = s.rstrip.lstrip } }
  x.report("s.gsub:")                  { a.each {|s| s = s.gsub(/^\s+|\s+$/, "") } }
  x.report("s.sub.sub:")               { a.each {|s| s = s.sub(/^\s+/, "").sub(/\s+$/, "") } }

  x.report("s.strip!")                 { a.each {|s| s.strip! } }
  x.report("s.rstrip!.lstrip!:")       { b.each {|s| s.rstrip! ; s.lstrip! } }
  x.report("s.gsub!:")                 { c.each {|s| s.gsub!(/^\s+|\s+$/, "") } }
  x.report("s.sub!.sub!:")             { d.each {|s| s.sub!(/^\s+/, "") ; s.sub!(/\s+$/, "") } }
end

결과는 다음과 같습니다.

ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-darwin14]
============================================================
Running tests for trimming strings
                           user     system      total        real
s.strip:               2.690000   0.320000   3.010000 (  4.048079)
s.rstrip.lstrip:       2.790000   0.060000   2.850000 (  3.110281)
s.gsub:               13.060000   5.800000  18.860000 ( 19.264533)
s.sub.sub:             9.880000   4.910000  14.790000 ( 14.945006)
s.strip!               2.750000   0.080000   2.830000 (  2.960402)
s.rstrip!.lstrip!:     2.670000   0.320000   2.990000 (  3.221094)
s.gsub!:              13.410000   6.490000  19.900000 ( 20.392547)
s.sub!.sub!:          10.260000   5.680000  15.940000 ( 16.411131)

3

내 개인적인 취향은 방법을 사용하고 있습니다 .tr

에서와 같이 :

string = "this is a string to smash together"

string.tr(' ', '') # => "thisisastringtosmashtogether"

공백 이 아닌 모든 공백을 삭제하려면 다음과 같이 작성해야합니다.

string = "this is a string with tabs\t and a \nnewline"

string.tr(" \n\t", '') # => "thisisastringwithtabsandanewline"

그러나 이것은 제거 spaces하지 않습니다all white spaces
Gavriel

모든 공백 (공백, 탭, 개행)을 제거하려면 s.tr(" \t\n", '')대신 사용 을 고려하십시오 .
Frank Schmitt

@Gavriel-질문을 잘못 읽거나 오해했습니다. 지적 해 주셔서 감사합니다.
Jeremy Gunter

@FrankSchmitt OP의 질문에 더 올바르게 대답하기 위해 답변에 수정 사항을 추가했습니다. 수정 해 주셔서 감사합니다.
Jeremy Gunter

3

뷰에서 ID로 레코드 "title"을 사용하고 싶었지만 제목에 공백이 있었 으므로이 작업을 수행하려고했습니다.

해결책은 다음과 같습니다.

record.value.delete(' ') # Foo Bar -> FooBar

1

루비 .scan().join()String 메소드는 문자열의 공백을 극복하는 데 도움이 될 수 있습니다.

scan(/\w+/).join 모든 공백을 제거하고 문자열을 결합합니다

string = "White spaces in me".scan(/\w+/).join
=>"Whitespacesinme"

또한 문자열의 왼쪽과 오른쪽 부분에서 공백을 제거합니다. 수단 ltrim, rtrimtrim. 이런 경우에 누군가가 배경 위에있는 경우 C, FoxPro또는 Visual Basic하고 뛰어 Ruby.

2.1.6 :002 > string = " White spaces in me ".scan(/\w+/).join => "Whitespacesinme" 2.1.6 :003 > string = " White spaces in me".scan(/\w+/).join => "Whitespacesinme" 2.1.6 :004 > string = "White spaces in me ".scan(/\w+/).join => "Whitespacesinme" 2.1.6 :005 >


1
@AmitPandya .scan () 메소드의 추가 요점을 지적 해 주셔서 감사합니다. 감사합니다 !!!
Dharmesh Rupani


1

게임에 약간 늦었지만을 사용하여 후행 및 선행 공백을 제거 strip!합니다. 내가 한 것처럼 배열이있는 경우 배열을 반복하고 인스턴스가 끝난 후에 저장해야했습니다. ! 이것을 처리했습니다. 이것은 첫 번째 선행 또는 마지막 후행뿐만 아니라 끝 또는 시작 부분의 모든 공백을 제거했습니다.

예를 들면 다음과 같습니다.

array = ["hello ","   Melanie", "is", " new ", "to  ", " programming"]
array.each do |i|
  i.strip!
end

[ "hello", "Melanie", "is", "new", "to", "programming"]으로 출력됩니다. 나는 비슷한 질문에 대해이 코드를 강조하기 위해 만든 비디오에서 이것을 더 탐구 / 공유했습니다 .

프로그래밍을 처음 접했고 루프가 끝난 후 배열에 저장하지 않았기 때문에 strip을 사용하지 못했습니다.


0

당신은 이것을 시도 할 수 있습니다 :

"ab c d efg hi ".split.map(&:strip)

이것을 얻으려면 :

["ab, "c", "d", "efg", "hi"]

또는 단일 문자열을 원하면 다음을 사용하십시오.

"ab c d efg hi ".split.join
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.