重音字符(变音符号)的具体 JavaScript 正则表达式

新手上路,请多包涵

我查看了 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 字符 - 经过测试和工作,虽然我没有尝试任何疯狂的东西,只是我在我们的语言部门看到的教员姓名的正常内容。

这是我的担忧:

  1. 第一个解决方案的局限性太大,草率而复杂。如果我忘记了一两个字符,就需要更改它,这不太实用。

  2. 第二种解决方案更好、更简洁,但它可能比实际匹配的要多得多。我找不到任何关于 --- . 匹配的真实文档,只是“除换行符之外的任何字符”的概括(来自 MDN 上的表格)。

  3. 第三种解决方案似乎是最精确的,但是有什么陷阱吗?我对 Unicode 不太熟悉,至少在实践中是这样,但查看 代码表/ 该表的延续\u00C0-\u017F 似乎非常可靠,至少对于我的预期输入而言。

  • 教职员工不会以他们的母语(例如,阿拉伯语、中文、日语等)提交带有他们名字的表格,所以我不必担心拉丁字符集外的字符

这三种方法中的哪一种最适合这项任务?或者有更好的解决方案吗?

原文由 Chris Cirefice 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 851
2 个回答

接受所有口音的更简单方法是:

 [A-zÀ-ú] // accepts lowercase and uppercase characters
[A-zÀ-ÿ] // as above, but including letters with an umlaut (includes [ ] ^ \ × ÷)
[A-Za-zÀ-ÿ] // as above but not including [ ] ^ \
[A-Za-zÀ-ÖØ-öø-ÿ] // as above, but not including [ ] ^ \ × ÷

有关按数字顺序列出的字符,请参阅 _Unicode 字符表_。

原文由 Maycow Moura 发布,翻译遵循 CC BY-SA 4.0 许可协议

带重音的拉丁语范围 \u00C0-\u017F 对于我的姓名数据库来说还不够,所以我将正则表达式扩展为

[a-zA-Z\u00C0-\u024F]
[a-zA-Z\u00C0-\u024F\u1E00-\u1EFF] // includes even more Latin chars

我添加了这些代码块( \u00C0-\u024F 一次包含三个相邻的块):

注意 \u00C0-\u00FF 实际上只是 Latin-1 Supplement 的一部分。它跳过不可打印的控制信号和所有符号,除了笨拙的乘法 × \u00D7 和除法 ÷ \u00F7

 [a-zA-Z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u024F] // exclude ×÷

如果您需要更多代码点,可以在维基百科的 Unicode 字符列表 上找到更多范围。例如,您还可以添加 Latin Extended-CDE ,但我将它们排除在外,因为现在似乎只有历史学家对它们感兴趣,而 D 和 E 集甚至无法在我的浏览器中正确呈现。

原始的正则表达式停止在 \u017F 名称“şenol”上。根据 FontSpace 的 Unicode Analyzer ,第一个字符是 \u0218 ,下面带有逗号的拉丁文大写字母 S。 (是的,它通常用变音符 S \u015E 拼写,“Şenol”。但我不会飞到土耳其去告诉他,“你的名字拼错了!”)

原文由 Chaim Leib Halbert 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题