小编典典

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

all

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

以下是我的担忧:

  1. 第一个解决方案过于局限,而且草率且令人费解。如果我忘记了一个或两个字符,就需要更改它,这不是很实用。

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

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

  4. 教师不会以他们的母语(例如,阿拉伯语、中文、日语等)提交姓名的表格,所以我不必担心超出拉丁字符集的字符


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


阅读 81

收藏
2022-05-22

共1个答案

小编典典

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

[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 字符表

2022-05-22