Làm cách nào tôi có thể trích xuất một chuỗi con từ trong một chuỗi trong Ruby?
Thí dụ:
String1 = "<name> <substring>"
Tôi muốn trích xuất substring
từ String1
(tức là mọi thứ trong lần xuất hiện cuối cùng của <
và >
).
Làm cách nào tôi có thể trích xuất một chuỗi con từ trong một chuỗi trong Ruby?
Thí dụ:
String1 = "<name> <substring>"
Tôi muốn trích xuất substring
từ String1
(tức là mọi thứ trong lần xuất hiện cuối cùng của <
và >
).
Câu trả lời:
String1.scan(/<([^>]*)>/).last.first
scan
tạo ra một mảng mà, đối với mỗi <item>
trong String1
chứa văn bản giữa <
và >
trong một mảng một yếu tố (vì khi sử dụng với một regex chứa nhóm chụp, quét tạo ra một mảng chứa các ảnh chụp cho mỗi trận đấu). last
cung cấp cho bạn chuỗi cuối cùng và first
sau đó cung cấp cho bạn chuỗi trong đó.
"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"
Không cần sử dụng scan
, nếu chúng ta chỉ cần một kết quả.
Không cần sử dụng Python match
, khi chúng ta có Ruby String[regexp,#]
.
Xem: http://ruby-doc.org/core/String.html#method-i-5B-5D
Ghi chú: str[regexp, capture] → new_str or nil
if we need only one result
giải pháp của mình. Và match()[]
chậm hơn, bởi vì đó là hai phương pháp thay vì một.
string[regex]
có thể đọc được trong kịch bản này, vì vậy đó là những gì tôi đã sử dụng cá nhân.
Bạn có thể sử dụng một biểu thức chính quy cho điều đó khá dễ dàng
Cho phép khoảng trắng xung quanh từ (nhưng không giữ chúng):
str.match(/< ?([^>]+) ?>\Z/)[1]
Hoặc không có khoảng trắng được phép:
str.match(/<([^>]+)>\Z/)[1]
<>
thực sự cần phải là điều cuối cùng trong chuỗi. Nếu ví dụ: chuỗi foo <bar> baz
được cho phép (và được cho là đưa ra kết quả bar
), thì chuỗi này sẽ không hoạt động.
Đây là một cách tiếp cận linh hoạt hơn một chút bằng cách sử dụng match
phương pháp. Với điều này, bạn có thể trích xuất nhiều hơn một chuỗi:
s = "<ants> <pants>"
matchdata = s.match(/<([^>]*)> <([^>]*)>/)
# Use 'captures' to get an array of the captures
matchdata.captures # ["ants","pants"]
# Or use raw indices
matchdata[0] # whole regex match: "<ants> <pants>"
matchdata[1] # first capture: "ants"
matchdata[2] # second capture: "pants"