我查看了 Stack Overflow( 替换字符.. 呃, JavaScript 如何不遵循有关 RegExp 的 Unicode 标准 等)并且还没有真正找到问题的具体答案“ JavaScript 如何匹配重音字符(那些带有变音符号)? ”
我强制 UI 中的字段匹配格式: last_name, first_name
(最后一个 [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
似乎非常可靠,至少对于我的预期输入而言。
- 教职员工不会以他们的母语(例如,阿拉伯语、中文、日语等)提交带有他们名字的表格,所以我不必担心拉丁字符集外的字符
这三种方法中的哪一种最适合这项任务?或者有更好的解决方案吗?
原文由 Chris Cirefice 发布,翻译遵循 CC BY-SA 4.0 许可协议
接受所有口音的更简单方法是:
有关按数字顺序列出的字符,请参阅 _Unicode 字符表_。