Tôi muốn thay thế lần xuất hiện cuối cùng của chuỗi con trong ruby. Cách đông nhất là gì? Ví dụ: trong abc123abc123, tôi muốn thay thế abc mới nhất thành ABC. Làm thế nào tôi có thể làm điều đó?Làm thế nào để thay thế sự xuất hiện cuối cùng của chuỗi con trong ruby?
Trả lời
Khi tìm kiếm trong suối lớn dữ liệu, sử dụng reverse
sẽ dứt khoát * dẫn đến vấn đề hiệu suất. Tôi sử dụng string.rpartition
*:
sub_or_pattern = "!"
replacement = "?"
string = "hello!hello!hello"
array_of_pieces = string.rpartition sub_or_pattern
(array_of_pieces[(array_of_pieces.find_index sub_or_pattern)] = replacement) rescue nil
p array_of_pieces.join
# "hello!hello?hello"
Cùng mã phải làm việc với một chuỗi không có sự xuất hiện của sub_or_pattern
:
string = "hello_hello_hello"
# ...
# "hello_hello_hello"
* rpartition
sử dụng rb_str_subseq()
nội bộ. Tôi đã không kiểm tra xem hàm đó có trả về một bản sao của chuỗi không, nhưng tôi nghĩ nó giữ nguyên phần bộ nhớ được sử dụng bởi phần đó của chuỗi. reverse
sử dụng rb_enc_cr_str_copy_for_substr()
, điều này cho thấy các bản sao được thực hiện mọi lúc - mặc dù có thể trong tương lai một lớp String
thông minh hơn có thể được thực hiện (có cờ reversed
được đặt thành true và có tất cả các chức năng hoạt động ngược khi được đặt), tính đến bây giờ, nó không hiệu quả.
Hơn nữa, không thể hoàn nguyên mẫu đơn Regex
.Câu hỏi này chỉ yêu cầu thay thế lần xuất hiện cuối cùng của chuỗi con, vì vậy, điều đó là ổn, nhưng độc giả cần một thứ gì đó mạnh mẽ hơn sẽ không được hưởng lợi từ câu trả lời được bình chọn nhiều nhất (theo văn bản này)
Làm thế nào về
new_str = old_str.reverse.sub(pattern.reverse, replacement.reverse).reverse
Ví dụ:
irb(main):001:0> old_str = "abc123abc123"
=> "abc123abc123"
irb(main):002:0> pattern="abc"
=> "abc"
irb(main):003:0> replacement="ABC"
=> "ABC"
irb(main):004:0> new_str = old_str.reverse.sub(pattern.reverse, replacement.reverse).reverse
=> "abc123ABC123"
"abc123abc123".gsub(/(.*(abc.*)*)(abc)(.*)/, '\1ABC\4')
#=> "abc123ABC123"
Nhưng có lẽ có một cách tốt hơn ...
Edit:
... mà Chris vui lòng cung cấp trong bình luận b elow.
Vì vậy, như *
là một nhà điều hành tham lam, sau đây là đủ:
"abc123abc123".gsub(/(.*)(abc)(.*)/, '\1ABC\3')
#=> "abc123ABC123"
Edit2:
Ngoài ra còn có một giải pháp mà gọn gàng minh họa phân mảng song song trong Ruby:
*a, b = "abc123abc123".split('abc', -1)
a.join('abc')+'ABC'+b
#=> "abc123ABC123"
Do khớp tham lam, chỉ cần 'str.sub (/(.*) abc /, '\ 1ABC')' là đủ. –
Doh! Cảm ơn, tôi đã cập nhật câu trả lời. –
Cảm ơn bạn rất nhiều. Tôi cũng nghĩ rằng vấn đề này có thể được giải quyết bằng biểu thức chính quy, nhưng không biết làm thế nào. Bạn làm được rồi. Cảm ơn một lần nữa! –
string = "abc123abc123"
pattern = /abc/
replacement = "ABC"
matches = string.scan(pattern).length
index = 0
string.gsub(pattern) do |match|
index += 1
index == matches ? replacement : match
end
#=> abc123ABC123
Đây là một giải pháp khả thi khác:
>> s = "abc123abc123"
=> "abc123abc123"
>> s[s.rindex('abc')...(s.rindex('abc') + 'abc'.length)] = "ABC"
=> "ABC"
>> s
=> "abc123ABC123"
đơn giản và hiệu quả:
s = "abc123abc123abc"
p = "123"
s.slice!(s.rindex(p), p.size)
s == "abc123abcabc"
Điều này không trả lời được câu hỏi. – aross
I ' đã sử dụng phương pháp helper tiện dụng này khá một chút:
def gsub_last(str, source, target)
return str unless str.include?(source)
top, middle, bottom = str.rpartition(source)
"#{top}#{target}#{bottom}"
end
Nếu bạn muốn làm cho nó nhiều hơn Rails-y, mở rộng nó trên lớp string bản thân:
class String
def gsub_last(source, target)
return self unless self.include?(source)
top, middle, bottom = self.rpartition(source)
"#{top}#{target}#{bottom}"
end
end
Sau đó, bạn chỉ có thể gọi nó là trực tiếp trên bất kỳ trường hợp Chuỗi nào, ví dụ: "fooBAR123BAR".gsub_last("BAR", "FOO") == "fooBAR123FOO"
Bạn có thể đạt được điều này với gsub và tham lam regexp .*
như thế này:
'abc123abc123'.gsub(/(.*)abc/, '\1ABC')
- 1. rreplace - Làm thế nào để thay thế sự xuất hiện cuối cùng của một biểu thức trong một chuỗi?
- 2. Làm thế nào để thay thế xuất hiện cuối cùng của ký tự trong một chuỗi sử dụng javascript
- 3. Tìm chỉ mục xuất hiện cuối cùng của chuỗi con trong một chuỗi
- 4. Ruby - thay thế sự xuất hiện đầu tiên của một chuỗi với một chuỗi
- 5. Tìm kiếm Perl và thay thế sự xuất hiện ký tự cuối cùng
- 6. Cách tìm số lần xuất hiện cuối cùng của một số trong chuỗi bằng Ruby?
- 7. Làm thế nào để tìm sự xuất hiện của một chuỗi trong chuỗi trong C + +?
- 8. Làm thế nào để phát hiện sự kết thúc của một chuỗi phương pháp trong Ruby
- 9. Sử dụng regex để chỉ thay thế lần xuất hiện cuối cùng của mẫu bằng JS
- 10. Làm thế nào để thay thế các lần xuất hiện của "-" bằng một chuỗi rỗng?
- 11. Làm thế nào để thay thế tất cả NHƯNG sự xuất hiện đầu tiên của một mẫu trong chuỗi
- 12. Làm cách nào để tìm thấy lần xuất hiện cuối cùng của chuỗi con trong một NSString?
- 13. cách thay thế lần xuất hiện cuối cùng của từ trong javascript?
- 14. Làm thế nào tôi có thể tìm thấy sự xuất hiện đầu tiên của chuỗi con xuất hiện sau một chuỗi con khác trong python?
- 15. StringBuilder: làm thế nào để có được chuỗi cuối cùng?
- 16. Làm thế nào để thay thế một chuỗi con của một chuỗi
- 17. Làm cách nào để thay thế ký tự cuối cùng trong chuỗi bằng VB6?
- 18. Trong thực tế, làm thế nào cuối cùng là "sự nhất quán cuối cùng" trong HRD?
- 19. Làm thế nào để thay thế sự xuất hiện đầu tiên của cụm từ thông dụng trong Python?
- 20. Xóa lần xuất hiện cuối cùng trong chuỗi
- 21. tsql "lần xuất hiện cuối cùng" bên trong một chuỗi
- 22. Thay thế ký tự cuối cùng trong một chuỗi
- 23. Tìm và thay thế xuất hiện thứ n của [trong ngoặc vuông] biểu hiện trong chuỗi
- 24. Làm thế nào để có được sự xuất hiện đầu tiên của một char trong xâu
- 25. làm thế nào để có được char cuối cùng của một chuỗi trong PHP?
- 26. Chuỗi thay thế trong chuỗi con
- 27. RegEx rằng sẽ phù hợp với sự xuất hiện cuối cùng của dấu chấm trong một chuỗi
- 28. Vim tìm thấy lần xuất hiện cuối cùng của
- 29. Làm thế nào để thay thế một chuỗi trong một chuỗi ngoại trừ lần xuất hiện đầu tiên
- 30. Làm thế nào để thay thế dấu chấm cuối cùng trong chuỗi bằng cách sử dụng cụm từ thông dụng?
rõ ràng và dễ hiểu câu trả lời. –