我查看了 Stack Overflow(替换字符.. eh,JavaScript 如何不遵循有关 RegExp 的 Unicode 标准等)并且还没有真正找到这个问题的具体答案:
How can JavaScript match for accented characters (those with diacritical marks)?
我正在强制 UI 中的字段匹配格式: last_name, first_name
(last [comma space] first),并且我想提供对变音符号的支持,但显然在 JavaScript 中它比其他语言/平台要困难一些。
这是我的原始版本,直到我想添加变音符号支持:
/^[a-zA-Z]+,\s[a-zA-Z]+$/
目前,我正在讨论添加支持的三种方法中的一种,所有这些方法我都已经测试并有效(至少在某种程度上,我真的不知道第二种方法的“程度”是什么)。他们来了:
明确列出我希望接受为有效的所有重音字符(蹩脚和过于复杂):
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àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+$/
- 这正确地将姓氏/名字与
accentedCharacters
.
我的另一种方法是使用.
字符类,以获得更简单的表达式:
var regex = /^.+,\s.+$/;
- 这几乎可以匹配任何东西,至少在以下形式中:
something, something
。没关系,我想...
我刚刚发现的最后一种方法可能更简单......
/^[a-zA-Z\u00C0-\u017F]+,\s[a-zA-Z\u00C0-\u017F]+$/
- 它匹配一系列 unicode 字符 - 测试和工作,虽然我没有尝试任何疯狂的东西,只是我在我们的语言部门看到的教员姓名的正常内容。
以下是我的担忧:
- 第一个解决方案太局限了,而且草率和令人费解。如果我忘记了一两个字符就需要更改它,这不太实用。
- 第二种解决方案更好、更简洁,但它可能比实际匹配的要多得多。我找不到任何实际的文件究竟是什么
.
比赛,(在从表中“任何除换行符字符”的只是概括MDN)。 第三种解决方案似乎是最精确的,但是有什么问题吗?我不是很熟悉的Unicode,在实践中至少,但看着码表/该表的延续,
\u00C0-\u017F
似乎是非常稳固,至少在我的预期输入。- 教职员工不会用他们的母语(例如阿拉伯语、中文、日语等)提交带有他们名字的表格,所以我不必担心拉丁字符集以外的字符
所以真正的问题是:这三种方法中的哪一种最适合这项任务?或者有更好的解决方案吗?