문자열에서 영숫자가 아닌 문자를 제거하고 공백을 유지하려면 어떻게합니까?


98

영숫자가 아닌 모든 문자를 제거하지만 공백은 유지하는 정규식을 만들고 싶습니다. 이것은 db에 도달하기 전에 검색 입력을 정리하는 것입니다. 지금까지 내가 가진 내용은 다음과 같습니다.

@search_query = @search_query.gsub(/[^0-9a-z]/i, '')

여기서 문제는 모든 공백을 제거한다는 것입니다. 공간을 유지하는 방법에 대한 솔루션?


저는 Rails 개발을하지 않습니다. 그런데 왜 Rails가 삭제를하도록 할 수 없습니까?
Andrew Grimm

답변:


187

부정 문자 그룹에 공백을 추가하십시오.

@search_query = @search_query.gsub(/[^0-9a-z ]/i, '')

4
빈 공간이 작동하지 않았으므로 '\ s'도 옵션 일 수 있습니다. @ search_query.gsub (/ [^ 0-9a-z \\ s] / i, '')
David Douglas

6
약간 덜 장황한 :@search_query.gsub!(/[^0-9a-z ]/i, '')
Benjineer

3
정확히 말하면 모든 악센트 부호가있는 문자를 제거하고 일부 언어에 적용되지 않을 수 있습니다.
Uelb

즉해야 @DavidDouglas \s하지\\s
덱스

9

이 경우 입력을 영구적으로 정리하기 위해 bang 메서드 (gsub 대신 gsub!)를 사용합니다.

#permanently filter all non-alphanumeric characters, except _
@search_query.gsub!(/\W/,'')

이렇게하면 정리하지 않고 코드의 다른 곳에서 @seach_query가 사용되는 상황을 피할 수 있습니다.


2
뱅 버전은 일치하는 것이 없으면 nil을 반환합니다. 아마도 당신이 원하거나 기대하는 결과가 아닐 것입니다. 문서에서 "String # gsub 대체를 수행하고, 대체가 수행되지 않은 경우 str 또는 nil을 반환합니다. 블록이없고 대체가 제공되지 않으면 대신 열거자가 반환됩니다."
dft

2
그의 예에서는 반환 값이 사용되지 않으므로 거의 관련이 없습니다.
야프 Haagmans

3

나는 포함 접근법을 사용했을 것입니다. 숫자를 제외하고 모두 제외하는 대신 숫자 만 포함했습니다. 예

@search_query.scan(/[\da-z\s]/i).join

0

아마도 이것은 그러한 경우에 효과가있을 것입니다.

# do not replace any word characters and spaces
@search_query = @search_query.gsub(/[^\w ]/g, '')

-3

(적어도 루비에서는) 더 나은 대답은 다음과 같습니다.

@search_query.gsub!(/^(\w|\s*)/,'')

1
이것은 (a) 단일 단어 문자 또는 (b) 문자열의 시작 부분에서 임의의 수의 공백을 제거합니다. 질문과 완전히 관련이 없으므로 답변이 아닙니다.
Sigi

2
큰 실수를 저질렀다 .. 내가 무슨 생각을했는지 모르겠다 : = (
John Doe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.