2009-11-18 37 views
5

Vui lòng cung cấp giải pháp để viết cụm từ thông dụng như sau trong C# .NET: Tôi sẽ yêu cầu RegEx cho Non-Alphabets (a đến z; A đến Z) và Non- Chữ số (0 đến 9). Có nghĩa là để nói như là cách ngược lại để nhận được biểu thức chính quy khác với bảng chữ cái và otherthan chữ số (0-9).Regex không phải là bảng chữ cái và không phải là số

Vui lòng đề xuất giải pháp cho tương tự.

Trả lời

17

Bạn có thể sử dụng một negated character class đây:

[^a-zA-Z0-9] 

Trên regex sẽ phù hợp với một nhân vật duy nhất mà không thể là một chữ thường hoặc chữ hoa Latin hoặc một số.

Các ^ vào lúc bắt đầu của lớp nhân vật (phần giữa []) phủ nhận lớp hoàn chỉnh để nó phù hợp với bất cứ điều gì không trong lớp, thay vì hành vi lớp nhân vật bình thường.

Để làm cho nó hữu ích, có thể bạn muốn một trong những:

  1. Zero hoặc nhiều ký tự như

    [^a-zA-Z0-9]* 
    

    Dấu (*) ở đây có nghĩa rằng phần trước có thể được lặp đi lặp lại zero hoặc nhiều lần hơn.

  2. Một hoặc nhiều như vậy nhân vật

    [^a-zA-Z0-9]+ 
    

    Các cộng (+) ở đây có nghĩa rằng phần trước có thể được lặp đi lặp lại một hoặc nhiều lần.

  3. Một đầy đủ (có thể rỗng) chuỗi, bao gồm duy nhất của nhân vật như vậy

    ^[^a-zA-Z0-9]*$ 
    

    Ở đây các nhân vật ^$ có một ý nghĩa như anchors, phù hợp với sự bắt đầu và kết thúc của chuỗi, tương ứng. Điều này đảm bảo rằng toàn bộ chuỗi bao gồm các ký tự không nằm trong lớp ký tự đó và không có ký tự nào khác đến trước hoặc sau chúng.

  4. Một đầy đủ (không rỗng) chuỗi, bao gồm duy nhất của nhân vật như vậy

    ^[^a-zA-Z0-9]+$ 
    

Lập một chút, điều này sẽ không (và không thể) đảm bảo rằng bạn sẽ không sử dụng bất kỳ ký tự nào khác, có thể từ các tập lệnh khác. Chuỗi аеΒ sẽ hoàn toàn hợp lệ với cụm từ thông dụng ở trên, vì nó sử dụng các chữ cái từ tiếng Hy Lạp và chữ Kirin. Hơn nữa có những cạm bẫy khác. Chuỗi á sẽ vượt qua biểu thức chính quy, trong khi chuỗi ́a sẽ không (vì nó tạo chữ á từ chữ a và dấu kết hợp dấu phụ).

Vì vậy, các lớp nhân vật bị từ chối phải được thực hiện cẩn thận vào những thời điểm.

Tôi cũng có thể sử dụng chữ số từ các kịch bản khác, nếu tôi muốn: ١٢٣ :-)

Bạn có thể sử dụng lớp nhân vật

[^\p{L&}\p{Nd}] 

nếu bạn cần phải chăm sóc trong những điều trên.

2

chỉ phủ nhận lớp:

[^A-Za-z0-9]

+0

Cảm ơn bạn. Cảm ơn bạn. Cảm ơn bạn. Cảm ơn bạn. :) – sukumar

+0

Rất tiếc ... Bộ nhớ ngón tay. :-(cố định :-) – beggs

2

Chấp hành sử dụng thiết lập địa phương:

[^[:alnum:]] 
+0

+1. Rất tốt. – Joey

+1

Thật không may là một khủng khiếp đối với .NET vì chúng không hỗ trợ Biểu thức khung POSIX. Theo http://www.regular-expressions.info/posixbrackets.html biểu thức '[\ p {L &} \ p {Nd}]' là một sự thay thế có thể cho các hương vị RE nhận dạng Unicode. – Joey

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