Tôi đã xem Stack Overflow ( thay thế các ký tự .. eh , làm thế nào JavaScript không tuân theo tiêu chuẩn Unicode liên quan đến RegExp , v.v.) và thực sự không tìm thấy câu trả lời cụ thể cho câu hỏi:
How can JavaScript match for accented characters (those with diacritical marks)?
Tôi đang buộc một trường trong giao diện người dùng phải khớp với định dạng: last_name, first_name
(lần cuối [dấu phẩy] trước tiên) và tôi muốn cung cấp hỗ trợ cho dấu phụ, nhưng rõ ràng trong JavaScript khó hơn một chút so với các ngôn ngữ / nền tảng khác.
Đây là phiên bản gốc của tôi, cho đến khi tôi muốn thêm hỗ trợ dấu phụ:
/^[a-zA-Z]+,\s[a-zA-Z]+$/
Hiện tại tôi đang tranh luận một trong ba phương pháp để thêm hỗ trợ, tất cả những phương pháp tôi đã thử nghiệm và hoạt động (ít nhất là ở một mức độ nào đó, tôi không thực sự biết "mức độ" của phương pháp thứ hai là gì). Họ đây rồi:
Liệt kê rõ ràng tất cả các ký tự có dấu mà tôi muốn chấp nhận là hợp lệ (khập khiễng và quá phức tạp):
var accentedCharacters = "àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ";
// Build the full regex
var regex = "^[a-zA-Z" + accentedCharacters + "]+,\\s[a-zA-Z" + accentedCharacters + "]+$";
// Create a RegExp from the string version
regexCompiled = new RegExp(regex);
// regexCompiled = /^[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+,\s[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+$/
- Điều này khớp chính xác tên / họ với bất kỳ ký tự có dấu nào được hỗ trợ trong
accentedCharacters
.
Cách tiếp cận khác của tôi là sử dụng .
lớp nhân vật, để có một biểu thức đơn giản hơn:
var regex = /^.+,\s.+$/;
- Điều này sẽ phù hợp với bất cứ điều gì, ít nhất là ở dạng :
something, something
. Điều đó ổn thôi, tôi cho rằng ...
Cách tiếp cận cuối cùng, mà tôi vừa tìm thấy có thể đơn giản hơn ...
/^[a-zA-Z\u00C0-\u017F]+,\s[a-zA-Z\u00C0-\u017F]+$/
- Nó phù hợp với một loạt các ký tự unicode - được thử nghiệm và hoạt động, mặc dù tôi không thử bất cứ điều gì điên rồ, chỉ là những thứ bình thường tôi thấy trong khoa ngôn ngữ của chúng tôi cho các tên giảng viên.
Đây là mối quan tâm của tôi:
- Giải pháp đầu tiên là quá hạn chế, và cẩu thả và hỗn độn ở đó. Nó sẽ cần phải được thay đổi nếu tôi quên một hoặc hai nhân vật, và điều đó không thực tế lắm.
- Giải pháp thứ hai là tốt hơn, súc tích, nhưng có lẽ nó phù hợp hơn nhiều so với thực tế. Tôi không thể tìm thấy bất kỳ tài liệu thực tế nào về chính xác những gì
.
khớp, chỉ là khái quát của "bất kỳ ký tự nào ngoại trừ ký tự dòng mới" (từ một bảng trên MDN ). Giải pháp thứ ba có vẻ là chính xác nhất, nhưng có bất kỳ vấn đề nào không? Tôi không quen thuộc lắm với Unicode, ít nhất là trong thực tế, nhưng nhìn vào bảng mã / tiếp tục của bảng đó ,
\u00C0-\u017F
dường như khá chắc chắn, ít nhất là cho đầu vào dự kiến của tôi.- Khoa sẽ không gửi biểu mẫu với tên của họ bằng ngôn ngữ mẹ đẻ của họ (ví dụ: tiếng Ả Rập, tiếng Trung Quốc, tiếng Nhật, v.v.) vì vậy tôi không phải lo lắng về các ký tự ngoài tiếng Latin
Vì vậy, câu hỏi thực sự : Cách tiếp cận nào trong ba cách này phù hợp nhất cho nhiệm vụ? Hoặc có giải pháp tốt hơn?
.
nguyên tử phù hợp với bất cứ điều gì ngoại trừ dòng mới " thực sự là khá chính xác :-)
regex = /^[^,]+,\s[^,]+$/;
để ngăn chặn điều đó.