Trước hết, bạn cần phải cẩn thận với gsub
và gsub!
. Cái sau là "nguy hiểm!" và sẽ sửa đổi giá trị của src
. Nếu bạn đang thực hiện các câu lệnh này theo thứ tự, hãy lưu ý rằng a.gsub!(/a/, "b")
và a = a.gsub(/a/, "b")
cả hai sẽ làm điều tương tự với a
. Một phần của vấn đề với mã của bạn là src
đang được sửa đổi.
Phương pháp B trả "his"
nhưng không có sự thay đổi để source
src[/([a-z]+)/] # => "his"
src # => "This Is A 101 Test"
Phương pháp C loại bỏ tất cả các ký tự mà không số:
src.gsub!(/\D/, "") # => "101"
src # => "101"
Phương pháp D không hoạt động bởi vì cú pháp là sai. Phương thức gsub
chấp nhận một biểu thức/chuỗi thông thường để tìm kiếm và sau đó một chuỗi để sử dụng để thay thế. Nếu bạn thử nó trong IRB, nó sẽ hoạt động như thể bạn cần một số khác /
.
E phương pháp thay thế tất cả các ký tự không lời nói và tất cả các số:
src.gsub(/(\W|\d)/, "") # => "This Is A Test" (note the two spaces)
src # => "This Is A 101 Test"
Bạn chỉ ra rằng nó trở ""
. Vâng, những gì thực sự xảy ra là C và D như được liệt kê (với các vấn đề cú pháp cố định) là phá hoại thay đổi. (Ngoài ra, nếu chạy trên "101"
, D sẽ thực sự trở lại nil
như không có sự thay thế đã được thực hiện.) Vì vậy, E được chỉ được chạy trên "101"
, và kể từ khi bạn đang thay thế tất cả các phi từ và tất cả các số với ""
, nó trở nên "101"
.
Câu trả lời bạn đang tìm kiếm sẽ là một cái gì đó như:
src.gsub!(/\d\s?/, "") # => "This Is A Test"
src # => "This Is A Test"
Và yêu thích của tôi để đối phó với tất cả các kịch bản của không gian hai (vì squeeze
là khá hiệu quả trong việc kết hợp như nhân vật, strip
là khá hiệu quả trong việc tước khoảng trắng ở cuối và những người đó !
trả lại nil
nếu họ không thực hiện thay thế):
src = src.gsub(/\d+/, "").squeeze(" ").strip
vị trí bật. cảm ơn! –