Bạn dường như thiếu sự lặp lại. Làm thế nào về:
^(?:[a-zA-Z0-9 ]+,)*[a-zA-Z0-9 ]+$
Tôi không chắc chắn làm thế nào bạn muốn bày tỏ rằng trong VB.Net, nhưng bằng Python:
>>> import re
>>> x [ "123, $a67, GGG, 767", "12333, 78787&*, GH778" ]
>>> r = '^(?:[a-zA-Z0-9 ]+,)*[a-zA-Z0-9 ]+$'
>>> for s in x:
... print re.match(r, s)
...
<_sre.SRE_Match object at 0xb75c8218>
None
>>>>
Bạn có thể sử dụng phím tắt thay vì liệt kê các phần [a-zA-Z0-9 ]
, nhưng điều này có lẽ dễ hiểu hơn.
Phân tích những điểm nổi bật:
[a-zA-Z0-9 ]+
: chụp một hoặc nhiều (nhưng không phải không) của các dãy niêm yết, và không gian.
(?:[...]+,)*
: Trong dấu ngoặc đơn không bắt, khớp một hoặc nhiều ký tự, cộng với dấu phẩy ở cuối. So khớp các chuỗi đó bằng 0 hoặc nhiều lần. Việc chụp lần không cho phép không có dấu phẩy.
[...]+
: nắm bắt ít nhất một trong số này. Điều này không bao gồm dấu phẩy. Điều này là để đảm bảo rằng nó không chấp nhận dấu phẩy. Nếu một dấu phẩy dấu là chấp nhận được, sau đó biểu thức là dễ dàng hơn: ^[a-zA-Z0-9 ,]+
Cụm từ thông dụng của bạn có nghĩa là "khớp với bit tiếp theo, nhưng không tiêu thụ, bất kỳ char nào, sau đó là az, AZ hoặc 0-9, theo sau là một trong số: dấu phẩy. Sau đó, sử dụng bất kỳ ký tự nào trước khi kết thúc chuỗi. " Nó không thể cho điều này để phù hợp với bất cứ điều gì, vì phần không tiêu thụ phải phù hợp với ba ký tự, bao gồm một dấu phẩy, trước khi phần tiêu thụ đến và chỉ có thể phù hợp với một điều. – markets
@markets: OP không sử dụng định dạng mã, do đó, hai bộ định lượng '*' không hiển thị. Regex vẫn còn sai, nhưng bây giờ nó có ý nghĩa hơn một chút. ;) @JohnH: Bạn sẽ nhận được kết quả tốt hơn nếu bạn sử dụng các công cụ định dạng của SO; Họ rất tốt. –