2012-03-27 30 views
80

Tôi đang gặp sự cố khi dịch mã này thành Ruby.Ruby thay chuỗi bằng mẫu regex bị bắt

Đây là một mảnh của JavaScript mà thực hiện chính xác những gì tôi muốn làm:

function get_code(str){ 
    return str.replace(/^(Z_.*): .*/,"$1")​​​​​​​​​​​​​​​​​​​​​​​​​​​; 
} 

Tôi đã thử gsub, sub, và replace nhưng không ai có vẻ để làm những gì tôi đang mong đợi.

Dưới đây là ví dụ về những điều tôi đã cố gắng:

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/) { |capture| capture } 
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "$1") 
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "#{$1}") 
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\1") 
"Z_sdsd: sdsd".gsub(/(.).*/) { |capture| capture } 
+0

Bạn nên hiển thị các mã thực tế cho những gì bạn đã đã thử. – Amber

+0

@Amber Tôi đặt mẫu tôi đã thử. –

Trả lời

138

Hãy thử '\1' cho việc thay thế (dấu nháy đơn rất quan trọng, nếu không bạn cần phải thoát khỏi \):

"foo".gsub(/(o+)/, '\1\1\1') 
#=> "foooooo" 

Nhưng vì bạn dường như chỉ quan tâm đến nhóm chụp, lưu ý rằng bạn có thể lập chỉ mục một chuỗi với một regex:

"foo"[/oo/] 
#=> "oo" 
"Z_123: foobar"[/^Z_.*(?=:)/] 
#=> "Z_123" 
+56

Lưu ý rằng điều này chỉ hoạt động nếu chuỗi thay thế nằm trong ** dấu nháy đơn **. Tôi lãng phí 5 phút để tìm ra điều đó. –

+7

@MarkThomas - thường lần chúng tôi thử câu trả lời hàng đầu/được chấp nhận trước mà không đọc toàn bộ câu trả lời. Điều đó dường như thường là phương tiện hiệu quả nhất để sửa chữa một vấn đề. Hãy để Vicky nghỉ ngơi! :) –

+0

@VickyChijwani Bình luận tốt, nhưng cũng lưu ý rằng khi sử dụng Ruby inline (trên dòng lệnh với '-e'), nó có nhiều khả năng nhìn thấy ** ngoặc kép **:' printf "Punkinhead tên" | ruby -ne 'đặt gsub /.* (tên) /, "Jonathans \\ 1"' 'vì biểu thức được cung cấp cho' -e' thường được bao trong dấu nháy đơn. –

1
def get_code(str) 
    str.sub(/^(Z_.*): .*/, '\1') 
end 
get_code('Z_foo: bar!') # => "Z_foo" 
29

\1 trong ngoặc kép cần phải được thoát. Vì vậy, bạn muốn một trong hai

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\\1") 

hoặc

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, '\1') 

thấy the docs on gsub nơi nó nói "Nếu đó là một chuỗi dụng dấu ngoặc kép, cả hai back-tài liệu tham khảo phải được bắt đầu bằng xuyệc ngược thêm."

Điều đó đang được nói, nếu bạn chỉ muốn kết quả của trận đấu bạn có thể làm:

"Z_sdsd: sdsd".scan(/^Z_.*(?=:)/) 

hoặc

"Z_sdsd: sdsd"[/^Z_.*(?=:)/] 

Lưu ý rằng (?=:) là một tổ chức phi chụp sao cho : không hiển thị trong trận đấu của bạn.

8
"foobar".gsub(/(o+)/){|s|s+'ball'} 
#=> "fooballbar" 
+2

không biết tôi có thể làm điều đó. Tốt đẹp! – vreen

1

Nếu bạn cần phải sử dụng một regex để lọc một số kết quả, và sau đó sử dụng chỉ nhóm chụp, bạn có thể làm như sau:

str = "Leesburg, Virginia 20176" 
state_regex = Regexp.new(/,\s*([A-Za-z]{2,})\s*\d{5,}/) 
# looks for the comma, possible whitespace, captures alpha, 
# looks for possible whitespace, looks for zip 

> str[state_regex] 
=> ", Virginia 20176" 

> str[state_regex, 1] # use the capture group 
=> "Virginia" 
Các vấn đề liên quan