2009-02-06 35 views
75

Tôi đang tìm cách để thực hiện một trận đấu regex trên một chuỗi trong Ruby và có nó ngắn mạch trên trận đấu đầu tiên.Trả lại trận đấu đầu tiên của Ruby regex

Chuỗi tôi đang xử lý dài và từ phương thức chuẩn (phương pháp match) sẽ xử lý toàn bộ nội dung, thu thập từng đối sánh và trả về đối tượng MatchData chứa tất cả các kết quả phù hợp.

match = string.match(/regex/)[0].to_s 

Trả lời

106

Bạn có thể thử variableName[/regular expression/]. Đây là ví dụ đầu ra từ IRB:

irb(main):003:0> names = "erik kalle johan anders erik kalle johan anders" 
=> "erik kalle johan anders erik kalle johan anders" 
irb(main):004:0> names[/kalle/] 
=> "kalle" 
+0

Điều này không phù hợp và trả về kết quả đầu tiên đằng sau hậu trường? – Gishu

+5

Sau khi một số điểm chuẩn với chuỗi độ dài khác nhau và nhìn vào nguồn C, nó quay ra Regex.match không ngắn mạch và chỉ tìm thấy trận đấu đầu tiên. –

+2

Gọn gàng, không biết về lối tắt này. – Pierre

19

Nếu chỉ là một sự tồn tại của một trận đấu rất quan trọng, bạn có thể đi với

/regexp/ =~ "string" 

Dù bằng cách nào, match chỉ nên trả lại hit đầu tiên, trong khi scan tìm kiếm trong toàn bộ chuỗi. Do đó nếu

matchData = "string string".match(/string/) 
matchData[0] # => "string" 
matchData[1] # => nil - it's the first capture group not a second match 
1

Cụm từ thông dụng (regex) không là gì ngoài máy trạng thái hữu hạn (FSM).

FSM cố trả lời câu hỏi "Nhà nước này có thể được hay không?"

Nó tiếp tục cố gắng thực hiện đối sánh mẫu cho đến khi tìm thấy kết quả (thành công) hoặc cho đến khi tất cả các đường được khám phá và không tìm thấy kết quả phù hợp (lỗi).

Khi thành công, câu hỏi "Nhà nước này có thể hay không?" đã được trả lời bằng "có". Do đó không cần kết hợp thêm nữa và regex trả về.

Xem thisthis để biết thêm về điều này.

Thêm: here is an interesting example để minh họa cách hoạt động của regex. Ở đây, một regex được sử dụng để phát hiện nếu một số cho là số nguyên tố. Ví dụ này là perl, nhưng nó cũng có thể được viết bằng ruby.

44

Bạn có thể sử dụng []: (đó là như match)

"[email protected]"[/\+([^@]+)/, 1] # matches what is inside() 
# => "account2" 
"[email protected]"[/\+([^@]+)/, 0] # matches whole regexp 
# => "+account2" 
+3

câu trả lời hoàn chỉnh nhất – akostadinov

1

Tôi chưa chắc chắn cho dù tính năng này là tuyệt vời hay chỉ là hoàn toàn điên rồ, nhưng regex của bạn có thể định nghĩa các biến địa phương.

/\$(?<dollars>\d+)\.(?<cents>\d+)/ =~ "$3.67" #=> 0 
dollars #=> "3" 

(Lấy từ http://ruby-doc.org/core-2.1.1/Regexp.html).

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