2012-04-18 31 views
13

Xin chào Tôi gần như mới với Regex này ... vì vậy, có thể sự cố của tôi thật dễ dàng nhưng tôi không thể tìm được giải pháp!Regex - chỉ cho phép một khoảng trống hoặc không có gì sau khi kết hợp

Tôi đang viết mẫu regex nhìn vào văn bản của người dùng và tô màu khác với các kết quả phù hợp được thiết lập. Tôi muốn ví dụ để vẽ với màu sắc khác, nếu người dùng viết một cái gì đó như thế này:

foo() 

điều là tôi KHÔNG muốn vẽ rằng nếu người dùng viết cái gì khác sau đó, tôi có nghĩa là nếu write dùng chỉ

"foo()" (or "foo() ") 

sau đó nó là tốt, tôi muốn vẽ nó, nhưng nếu người dùng viết

"foo()d" 

tôi không muốn vẽ vì đó là điều ai cũng viết cho tôi.

Tôi đã viết mẫu regex khớp với "foo()" (hoặc cũng có dấu chấm ở giữa, như "foo.foo()"), nhưng tôi đang đối mặt với vấn đề đó. tôi cần phải thêm cái gì đó để mô hình của tôi mà chỉ cho phép một dấu cách, hoặc không có gì (nếu người dùng ghi cái gì khác sau "):" Tôi không muốn để phù hợp với nó) Đây là mô hình của tôi:.

[a-z]*\.?[a-z]*\(("[^"\r\n]*"|[-]?\b\d+[\.]?\d*\b)?\) 

Cảm ơn bạn rất nhiều!

+1

Nó không hoàn toàn rõ ràng những gì bạn đang yêu cầu. Có nhân vật nào sau này không? Nếu không, bạn chỉ có thể kết thúc regex bằng '\ s? $'. –

+0

phải, điều này sẽ không hoạt động vì tôi muốn cho phép người dùng tiếp tục viết ... – gezequiel

Trả lời

12

David Brabant gần, nhưng tôi nghĩ rằng bạn thực sự muốn thử kết thúc biểu thức chính quy của bạn với (?!\S) - điều này sẽ có nghĩa là bạn sẽ khớp với bất kỳ thứ gì không được theo sau bởi một ký tự không khoảng trắng. Nếu bạn chỉ muốn đối sánh trên không gian thay vì khoảng trắng, hãy sử dụng (?![^ ]).

+0

Vì bạn chưa quen với Regex, bạn cũng có thể không biết về^và $ ký hiệu. Chúng là những đường neo. Ví dụ: nếu regex của bạn là "^ foo() []? $", Nó sẽ khớp với "foo()" và "foo()" CHỈ cho toàn bộ dòng. – Scen

+0

vâng, tôi biết về những biểu tượng đó, nhưng nó sẽ không hoạt động đối với trường hợp của tôi ... – gezequiel

0

[az] [az] (("[^" \ r \ n] "| - [.]? [] \ B \ d + \ d \ b)). [] ?

thêm một []? nên làm điều đó.? được sử dụng cho 1 hoặc 0, [] sẽ chỉ phù hợp với không gian.

Ngoài ra, [\ s]? sẽ làm việc cho tất cả các loại khoảng trắng (tab bao gồm)

+0

Điều này sẽ không hoạt động, như thể ký tự tiếp theo không phải là khoảng trắng, nó sẽ khớp với không gian bằng không. Tôi nghĩ gezequiel muốn thất bại nếu anh ấy khớp '\ S', tức là ký tự không khoảng trắng. –

+0

Ah cảm ơn Ade, nên đã đọc kỹ câu hỏi hơn. – Scen

0

Điều này dường như làm những gì bạn đang tìm kiếm theo thử nghiệm regex của tôi:

[a-z]*\.?[a-z]*\(("[^"\r\n]*"|[-]?\b\d+[\.]?\d*\b)?\)([ ]?)(?!.) 

Nếu bạn muốn cho phép nhiều hơn một không gian, sử dụng này:

[a-z]*\.?[a-z]*\(("[^"\r\n]*"|[-]?\b\d+[\.]?\d*\b)?\)([ ]*)(?!.) 
4

Sử dụng cái nhìn tiêu cực về phía trước:

(\w+)(\.*)(\(\))+(\s)*(?!.) 

Phần quan trọng cho bạn trong regex trên là: (\ s) *()

(\ s) *:?!. tiếp theo 0 hoặc nhiều không gian trắng ():?!. và không có nhân vật khác

+0

điều này thật tuyệt! cảm ơn! – gezequiel

+0

+1: Câu trả lời hay! Hoạt động hoàn hảo. –

+0

@gezequiel: Xem bình luận trước của tôi. Có một chút tinh chỉnh bạn cần thực hiện cho điều này. –

0

bạn có thể thử thêm:

\ s *%?

\ s *: zero hoặc nhiều không gian

% có nghĩa là: cuối chuỗi

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