2009-03-10 11 views
5

Tôi muốn biểu thức chính quy cho C# khớp với "Johnson", "Del Sol" hoặc "Del La Range"; nói cách khác, nó phải phù hợp với các từ có khoảng trắng ở giữa nhưng không có khoảng trắng ở đầu hoặc cuối.Cụm từ thông dụng trong C# cho Tên họ bao gồm không gian nội bộ

+1

Chuỗi đầu vào trông như thế nào? Tên cuối cùng là phần duy nhất của chuỗi, hay là một câu, hoặc có thể là một tên đầy đủ với nhiều khoảng trống tùy chọn hơn? Tôi nghĩ bối cảnh là quan trọng ở đây. – Rich

Trả lời

0

? vòng loại là bạn của bạn. Làm cho một trận đấu ngắn nhất có thể thay vì một trận đấu tham lam. Sử dụng tên này cho tên đầu tiên, như sau:

^(.+?) (.+)$ 

Nhóm 1 lấy mọi thứ đến không gian đầu tiên, nhóm 2 nhận phần còn lại.

Tất nhiên, bây giờ bạn sẽ làm gì nếu tên đầu tiên có chứa khoảng trắng?

+0

Đẹp và đơn giản, nhưng tôi nghĩ rằng nó sẽ phù hợp với "238 39592" là tốt, mà không phải là từ. –

+0

rồi thay thế "." với "\ w" hoặc "[a-zA-Z]" – Rich

+0

Không chắc chắn liệu OP có muốn khớp tên cuối cùng hay trong chuỗi chứa cả tên và họ ... Tôi cho rằng tên cũ, trong khi bạn dường như đã làm sau này. Tuy nhiên, nó xuất hiện regex của bạn cho phép không gian ở đầu hoặc cuối, mà cần phải được cố định. – Noldorin

0

Hãy thử một cái gì đó như thế này:

^[^\s][\w\s]*[^\s]$ 
+0

Tôi không nghĩ rằng tên cuối cùng có thể chứa số ... –

3

này nên thực hiện công việc:

^[a-zA-Z][a-zA-Z ]*[a-zA-Z]$ 

Edit: Dưới đây là một sự cải thiện nhẹ cho phép một sau tên và dấu gạch nối/dấu nháy trong tên :

^[a-zA-Z'][a-zA-Z'- ]*[a-zA-Z']?$ 
+0

Malcolm X sẽ không hài lòng về điều này ... (yêu cầu tối thiểu 2 chữ cái cuối cùng là ...) –

+0

Tên REAL ngắn nhất tôi có thể nghĩ là "Ng." Nên ổn thôi. ;) –

+0

Một số khác không có tên thật "U" ... –

5
^\p{L}+(\s+\p{L}+)*$ 

regex này có các tính năng sau:

  • sẽ phù hợp với một một bức thư cuối cùng tên (ví dụ Tên cuối cùng Malcolm X)
  • Sẽ không phù hợp với tên cuối cùng có chứa con số (như bất cứ điều gì với một \w hoặc một [^ ] sẽ)
  • Matches unicode chữ

Nhưng những gì về tên cuối cùng như "O'Connor" hoặc hyphenated tên cuối cùng ... hmm ...

-1

tôi nghĩ rằng đây là hơn những gì bạn đang tìm kiếm:

^[^ ][a-zA-Z ]+[^ ]$ 

shou này ld khớp với phần đầu của dòng không có dấu cách, ký tự alpha hoặc dấu cách và không có dấu cách ở cuối.

này hoạt động trong IRB, nhưng lần cuối cùng tôi đã làm việc với C#, tôi đã sử dụng regexes tương tự:

(zero là tốt, có nghĩa là con số không thất bại)

>> "Di Giorno" =~ /^[^ ][a-zA-Z ]+[^ ]$/ 
=> 0 
>> "DiGiorno" =~ /^[^ ][a-zA-Z ]+[^ ]$/ 
=> 0 
>> " DiGiorno" =~ /^[^ ][a-zA-Z ]+[^ ]$/ 
=> nil 
>> "DiGiorno " =~ /^[^ ][a-zA-Z ]+[^ ]$/ 
=> nil 
>> "Di Gior no" =~ /^[^ ][a-zA-Z ]+[^ ]$/ 
=> 0 
+1

Sử dụng [^] sẽ khớp với tên cuối cùng bắt đầu hoặc kết thúc bằng số, dấu chấm câu, v.v ... –

+0

Danny nói đúng. Tôi trả lời với cùng một giải pháp và rút lại nó khi tôi nhận ra điều này. –

3

Trong tên "Salah ad -Dīn Yūsuf ibn Ayyūb "(xem http://en.wikipedia.org/wiki/Saladdin), đó là tên đầu tiên, và đó là người cuối cùng? Còn cái tên "Roberto Garcia y Vega" (được phát minh) thì sao? "Chiang Kai-shek" (xem http://en.wikipedia.org/wiki/Chang_Kai-shek)?

Không gian tên là ít nhất trong số các vấn đề của bạn! Xem Personal names in a global application: What to store.

+0

Tôi đồng ý. Không có vấn đề làm thế nào bạn cố gắng, bạn sẽ luôn luôn tìm thấy tên mà không phù hợp một cách chính xác. Ý tôi là, nếu bạn không hoàn toàn kiểm soát được tên bạn đang phân tích cú pháp. –

0

Dưới đây là một tốt hơn một:

/^[a-zA-Z]+(([\'\,\.\- ][a-zA-Z ])?[a-zA-Z]*)*$/ 

Cho phép chấm câu và không gian tiêu chuẩn, nhưng không thể bắt đầu với dấu chấm câu.