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

2022-02-21 00:00:00 unicode regex javascript

我已经查看了堆栈溢出(replacing characters.. eh、how JavaScript doesn't follow the Unicode standard concerning RegExp等)。)并且还没有真正找到问题的具体答案&JavaScript如何匹配重音字符(带有变音符号的字符)?&qot;

我强制UI中的一个字段匹配格式:last_name, first_name(最后一个[逗号]优先),我希望提供对变音符号的支持,但显然在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。我想没问题的…

最后一种方法(我只是found)可能更简单.

/^[a-zA-Zu00C0-u017F]+,s[a-zA-Zu00C0-u017F]+$/
  • 它与一系列Unicode字符匹配--经过测试并且工作正常,不过我并没有尝试任何疯狂的东西,只是我在我们语言系看到的教职员工姓名的正常内容。

以下是我的担忧:

  1. 第一个解决方案太过有限,而且草率而又令人费解。如果我忘了一两个字符,就需要更改,而这是不太实际的。

  2. 第二个解决方案更好、更简洁,但它可能比实际应该匹配的要多得多。我找不到关于与.完全匹配的的任何真正文档,只能找到除换行符";(来自MDN上的表)之外的任何字符的泛化。

  3. 第三种解决方案似乎是最精确的,但是有什么问题吗?我不太熟悉Unicode,至少在实践中是这样,但是查看code table/continuation of that table,u00C0-u017F似乎相当可靠,至少对于我预期的输入是这样。

  • 教职员工不会使用母语(例如,阿拉伯语、中文、日语等)提交姓名的表单,因此我不必担心拉丁文字符集之外的字符

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


解决方案

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

[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 Character Table。

相关文章