2010-10-27 26 views
7

Tôi đang gặp khó khăn để có được một regexp (trong Ruby) sẽ cung cấp sau đâyLàm thế nào để phù hợp với một chuỗi lên đến dấu phẩy đầu tiên (nếu có) với một regexp của Ruby

"one, two" -> "one" 
"one, two, three" -> "one" 
"one two three" -> "one two three" 

Tôi muốn để phù hợp với bất kỳ ký tự nào cho đến dấu phẩy đầu tiên trong chuỗi. Nếu không có dấu phẩy, tôi muốn toàn bộ chuỗi được khớp. nỗ lực hết sức mình cho đến nay là

/.*(?=,)?/ 

này tạo ra đầu ra sau đây từ các ví dụ trên

"one, two" -> "one" 
"one, two, three" -> "one, two" 
"one two three" -> "one two three" 

Đóng nhưng không có điếu xì gà. Có ai giúp được không?

Trả lời

10

Tôi tự hỏi nếu nó không thể đơn giản hơn:

/([^,]+)/ 
+0

Thật tuyệt. Nó hoạt động giống như/[^,] +/ – brad

+0

Trông giống như một nụ cười kỳ lạ! – MOnsDaR

2

Làm thế nào về /.*?(?=,|$)/ Bằng cách đó, nó đọc đến cuối hoặc dấu phẩy.

+0

Nhưng nếu anh ta có '/.*?(?=,)?/', điều đó có phù hợp với chuỗi rỗng không? – LarsH

8

Chỉ khớp với các dấu phẩy không bắt đầu từ công việc ban đầu? ví dụ .:

/^[^,]+/ 
+0

Tôi đã có một ý tưởng tương tự. Tôi nghĩ rằng bạn cần parens cho việc chụp, nhưng tôi có thể ăn cắp của bạn bắt đầu-of-line neo. – Telemachus

+0

@Telemachus, bạn không cần parens để cho toàn bộ regexp khớp với chuỗi được yêu cầu. – LarsH

+0

@Telemachus, tùy thuộc vào cách bạn sử dụng nó, ví dụ: string.match (/.../) sẽ trả về bất kỳ thứ gì khớp với regex hoặc nil nếu không có gì khớp, không cần chụp. EDIT: Những gì LarsH nói. – pbaumann

14

Liệu nó là một regex? Một giải pháp khác:

text.split(',').first 
+0

Nó không phải là - nhưng tôi muốn 'nó là – brad

+0

Tò mò. Tại sao bạn muốn 'nó là một regex? Có lợi thế không? –

+2

@brad Đối với những gì nó có giá trị, bạn không nên nhận được vào thói quen suy nghĩ rằng tất cả các vấn đề chuỗi yêu cầu regexes. Bạn có thể xử lý nhiều trường hợp theo những cách khác. – Telemachus

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