2010-06-01 9 views
9

Những biểu hiện thường xuyên Tôi có thể sử dụng để phù hợp (cho phép) bất kỳ loại lá thư từ bất kỳ ngôn ngữ.net Regular Expression để phù hợp với bất kỳ loại lá thư từ bất kỳ ngôn ngữ

tôi cần phải phù hợp với bất kỳ thư bao gồm bất kỳ dấu (ví dụ á , ü, ñ, vv) và loại trừ bất kỳ loại biểu tượng nào (ký hiệu toán học, ký hiệu tiền tệ, dingbats, ký tự hộp vẽ, vv) và các ký tự dấu chấm câu.

Tôi đang sử dụng asp.net MVC 2 với .net 4. Tôi đã cố gắng chú thích này trong mô hình quan điểm của tôi:

[RegularExpression(@"\p{L}*", ... 

và một này:

[RegularExpression(@"\p{L}\p{M}*", ... 

nhưng phía khách hàng xác nhận không hoạt động.

UPDATE: Cảm ơn bạn cho tất cả các câu trả lời của bạn, đề nghị bạn làm việc nhưng chỉ cho .net và vấn đề ở đây là nó cũng sử dụng regex để xác nhận phía khách hàng với JavaScript (xin lỗi nếu điều này là không đủ rõ ràng) . tôi đã phải đi với:

[^ 0-9_ \ | ° ¬ # \ $%/\() \ ¡¿+ {} []:!?. \,; @ ª^* <> = &] *

rất xấu và không bao gồm tất cả các trường hợp nhưng là điều gần nhất với những gì tôi cần.

+0

Ý của bạn là "Nó không hoạt động"? Đây không phải là một mô tả rất ngắn gọn về vấn đề này. –

+0

tốt, không hoạt động có nghĩa là nó không xác nhận những gì tôi cần để xác nhận, hoặc những gì nó phải xác nhận (xem Lukas liên kết), nhưng để cụ thể hơn bất cứ điều gì tôi đặt nó không hợp lệ – pedro

+0

Nó có làm việc cho bạn? hoặc bạn có một regex alternitave cho điều này? – pedro

Trả lời

1

Một điều cần lưu ý là regex phía máy khách. Nó sử dụng javascript regex ở phía client và .net regex ở phía máy chủ. Javascript sẽ không hỗ trợ kịch bản này.

0

\ w - phù hợp với bất kỳ ký tự chữ và số (bao gồm cả số)

Trong các thử nghiệm của tôi nó đã xuất hiện:

  • ã
  • à
  • ç
  • z

và chưa khớp:

  • ;
  • ,
  • \
  • :

Trong trường hợp bạn biết chính xác những gì bạn muốn loại trừ (như một danh sách nhỏ), bạn CAND làm như sau:

[^;, \ ` .]

mà phù hợp với một bất cứ lúc nào nhân vật mà isnt:

  • ;
  • ,
  • \
  • '
  • .

Hy vọng điều đó sẽ hữu ích!

+1

'\ w' cũng sẽ khớp với' _' – Senseful

+0

@eagle hmm .. bạn nói đúng, ít nhất tôi đã đưa ra một giải pháp thay thế. Hãy kiểm tra nó mặc dù – Marcelo

+0

\ w - viết tắt của Word. Không phải thư. –

1

\p{L}* phải khớp với "bất kỳ loại thư nào từ bất kỳ ngôn ngữ nào". Nó sẽ làm việc, tôi sử dụng nó trong một i18n-proof uppercase/lowercase recognition regex trong .NET.

+0

Sau đó, vấn đề có thể cụ thể hơn tôi nghĩ, tôi sẽ cập nhật câu hỏi – pedro

5

Bỏ qua giáo viên ngữ pháp của bạn và sử dụng hai âm:

[^\W\d_] 

Hãy nhớ rằng \w trận đấu bất kỳ lá thư, chữ số, hoặc dấu gạch dưới, để loại trừ chúng như trên. Bạn có thể đọc nó như là "không phải là một ký tự, không phải là một chữ số, và không phải là một gạch dưới" - mà chỉ để lại chữ cái. Áp dụng định lý DeMorgan, và nó có ý nghĩa hơn: “một từ ký tự nhưng không phải là một chữ số hay dấu gạch dưới”

4

Bạn có thể sử dụng Char.IsLetter:

Cho biết các ký tự Unicode định được phân loại như một Unicode lá thư.

Với Net 4.0:

string onlyLetters = String.Concat(str.Where(Char.IsLetter)); 

On 3,5 String.Concat chỉ excepts một mảng, vì vậy bạn cũng nên gọi ToArray.

+1

+1 Tốt hơn với Char.IsLetter hơn regex :) – Christian

+0

Điều này không trả lời câu hỏi, không nhất thiết phải giải quyết vấn đề, có lẽ nó đã được thực hiện để tìm hiểu REGEX, tôi không biết. Ok, nó có thể là một vấn đề, nhưng ông đặc biệt yêu cầu làm thế nào để làm điều đó với regex (thông qua câu hỏi, một thẻ, và thậm chí cả tiêu đề), đó là rõ ràng hoàn thành. 1 để giải quyết 'vấn đề', -1 vì không trả lời câu hỏi. Trung tính. – Marcelo

+0

Điều đó không hoạt động "ở phía máy khách" – GvS

2

Vấn đề của bạn có nhiều khả năng là bạn sẽ chỉ phải có một alpha-char, vì regex sẽ khớp với bất kỳ thứ gì có ít nhất một char.

Bằng cách thêm ^ làm tiền tố và $ làm hậu tố, toàn bộ câu phải tuân thủ regex của bạn. Vì vậy, prob này hoạt động:

^\p{L}*$ 

RegexBuddy giải thích: Vị trí

  1. ^ Khẳng định ngay từ đầu của chuỗi
  2. \p{L} Một nhân vật với Unicode tài sản 'chữ' (bất kỳ loại lá thư từ bất cứ loại nào ngôn ngữ) 2a. Giữa zero và thời gian không giới hạn, càng nhiều càng tốt (tham lam)
  3. $ vị trí Khẳng định ở phần cuối của chuỗi
+0

'\ p {L}' là người chiến thắng = "Khớp bất kỳ loại chữ nào từ bất kỳ ngôn ngữ nào" –

1

Tôi vừa phải xác nhận một URL và tôi đã chọn biểu thức chính quy này trong .NET.

^[(\p{L})?(\p{M})?-]*$ 

Bắt đầu và kết thúc bằng ký tự của bất kỳ ngôn ngữ nào (tùy ý là chữ cái hoặc dấu) và cho phép dấu gạch nối.