Làm cách nào để tách các ký tự không phải chữ và số khỏi một chuỗi và giữ khoảng trắng?


98

Tôi muốn tạo một regex loại bỏ tất cả các ký tự không phải chữ số nhưng vẫn giữ khoảng cách. Điều này là để làm sạch đầu vào tìm kiếm trước khi nó chạm vào db. Đây là những gì tôi có cho đến nay:

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

Vấn đề ở đây là nó loại bỏ tất cả các khoảng trắng. Giải pháp về cách giữ lại không gian?


Tôi không làm công việc phát triển Rails, nhưng tại sao bạn không thể để Rails thực hiện việc dọn dẹp?
Andrew Grimm

Câu trả lời:


186

Thêm dấu cách vào nhóm ký tự bị phủ định:

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

4
Không gian trống không phù hợp với tôi, vì vậy '\ s' cũng có thể là một tùy chọn: @ search_query.gsub (/ [^ 0-9a-z \\ s] / i, '')
David Douglas

6
hơi ít dài dòng:@search_query.gsub!(/[^0-9a-z ]/i, '')
Benjineer

3
Nói chính xác, thao tác này sẽ xóa tất cả các chữ cái có dấu và có thể không được điều chỉnh cho phù hợp với một số ngôn ngữ.
Uelb

@DavidDouglas Đó nên là \skhông\\s
Dex

9

Trong trường hợp này, tôi sẽ sử dụng phương thức bang (gsub! Thay vì gsub) để xóa đầu vào vĩnh viễn.

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

Điều này tránh trường hợp @seach_query được sử dụng ở nơi khác trong mã mà không làm sạch nó.


2
Phiên bản bang sẽ trả về con số không nếu không có gì phù hợp. Có thể không phải là kết quả bạn muốn hoặc mong đợi. Từ tài liệu "Thực hiện các thay thế của Chuỗi # gsub tại chỗ, trả về str hoặc nil nếu không có thay thế nào được thực hiện. Nếu không có khối nào và không có thay thế nào được đưa ra, thì một điều tra viên sẽ được trả về."
dft

2
Trong ví dụ của anh ta, giá trị trả về không được sử dụng, vì vậy điều đó khá không liên quan.
Jaap Haagmans

3

Tôi sẽ sử dụng cách tiếp cận bao gồm. Thay vì loại trừ tất cả trừ các con số, tôi sẽ chỉ bao gồm các con số. Ví dụ

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

0

Có thể điều này sẽ hoạt động cho trường hợp như vậy:

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

-3

Một câu trả lời tốt hơn (ít nhất là bằng ruby) là:

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

1
Thao tác này sẽ loại bỏ (a) một ký tự từ đơn lẻ hoặc (b) bất kỳ số lượng khoảng trắng nào từ đầu chuỗi. Hoàn toàn không liên quan đến câu hỏi, và do đó không phải là câu trả lời.
Sigi

2
đã phạm một sai lầm lớn .. không biết tôi đang nghĩ gì: = (
John Doe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.