2011-08-15 25 views
5

Tôi đã có những điều sau đây: text.gsub(/(lower) (upper)/, '\1 \2')Thay đổi trường hợp thay người

Tôi có thể làm chỉ là thay \2 chữ hoa?

Giống như: sed -e 's/\(abc\)/\U\1/'

Điều này có thể thực hiện được trong Ruby không?

Trả lời

6

xem tài liệu gsub:

str.gsub (pattern) {| match | block} → new_str

Ở dạng khối, chuỗi đối sánh hiện tại được chuyển thành tham số và các biến như $ 1, $ 2, $ `, $ & và $ 'sẽ được đặt thích hợp. Giá trị được trả về bởi khối sẽ được thay thế cho trận đấu trên mỗi cuộc gọi.

"a lower upper b".gsub(/(lower) (upper)/){|s| $1 + " " + $2.upcase}

+0

Cảm ơn bạn, đó chính xác là những gì tôi đang tìm kiếm. –

2

gsub lấy một đối số khối, được chạy cho mỗi trận đấu, chuyền trong trận đấu dưới dạng tham số - vì vậy bạn có thể làm bất cứ điều gì bạn thích với nó! Ví dụ: để viết hoa mỗi từ trong một chuỗi:

"ruby blocks are pretty awesome".gsub(/\w+/) do |match| 
    match.capitalize 
end 
#=> "Ruby Blocks Are Pretty Awesome" 
2

Tôi là người mới dùng Ruby - chỉ mới bắt đầu sử dụng nó vài ngày trước nhưng có lẽ điều này sẽ hoạt động? Bạn sẽ có thể để có được những backreferences như các biến tên $n trong Bock:

new_text = text.gsub(/(lower) (upper)/){ 
    "#{$1} #{$2.upcase}" 
} 

Cập nhật
Hình như Brandon đánh bại tôi vào nó bằng khoảng 8 phút :) Đây là khá nhiều điều tương tự AFAIK

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