2012-09-21 34 views
5

Trong ứng dụng của tôi, tôi cần tìm tất cả các số nền, sau đó quét từng phần, tìm đầu tiên khớp với một phạm vi (chẳng hạn như từ 5 đến 15) và thay thế cá thể THAT bằng chuỗi khác "X".ruby ​​regex - cách thay thế thể hiện thứ n của một trận đấu trong một chuỗi

chuỗi My thử nghiệm s = "1 foo 100 bar 10 gee 1"

mô hình ban đầu của tôi là bất kỳ chuỗi của 1 hoặc nhiều chữ số, ví dụ, re = Regexp.new(/\d+/)

matches = s.scan(re) cho ["1", "100", "10", "1"]

Nếu tôi muốn thay thế các trận đấu thứ N, và chỉ Trận đấu thứ N, với chữ "X" thì sao?

Ví dụ nếu tôi muốn thay thế các trận đấu thứ ba "10" (trận đấu [2]) Tôi không thể chỉ nói s[matches[2]] = "X" vì đó thực hiện hai thay thế

"1 foo X0 bar X gee 1"

Bất kỳ trợ giúp sẽ được đánh giá cao !

Trả lời

7

String#gsub có biểu mẫu có khối. Nó mang lại cho khối cho mỗi trận đấu, và thay thế trận đấu với kết quả của khối. Vì vậy:

first = true 
"1 foo 100 bar 10 gee 1 12".gsub(/\d+/) do |digits| 
    number = digits.to_i 
    if number >= 5 && number <= 15 && first 
    # do the replacement 
    first = false 
    'X' 
    else 
    # don't replace; i.e. replace with itself 
    digits 
    end 
end 
# => "1 foo 100 bar X gee 1 12" 
+0

tôi phải thừa nhận nó không bao giờ xảy ra với tôi để thay thế các kết quả phù hợp khác với chính họ ... thông minh! cảm ơn! – jpwynn

+1

Tôi thích sử dụng 'next' thay vì trả lại giá trị ban đầu. – bwest

+0

Sử dụng các khối giúp giải quyết vấn đề của tôi. Cảm ơn bạn! – sbos61

Các vấn đề liên quan