具体的Javascript正则expression式重音字符(变音符号)

我看了堆栈溢出( replace字符..呃 , 如何JavaScript不遵循有关RegExp的Unicode标准等),并没有真正find具体的答案的问题:

How can JavaScript match for accented characters (those with diacritical marks)?

我迫使UI中的字段匹配格式: last_name, first_name (last [comma space] first) ,我想提供对变音符号的支持,但显然在JavaScript中比其他语言/平台更困难。

这是我原来的版本,直到我想添加diacritic支持:

/^[a-zA-Z]+,\s[a-zA-Z]+$/

目前我正在讨论三种添加支持的方法之一,所有这些方法我都已经testing过了(至less在某种程度上,我并不知道第二种方法的“范围”是什么)。 他们来了:

明确列出所有我想接受的有重音的字符(蹩脚且过于复杂):


 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àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+$/ 
  • 这正确地匹配了accechableCharacters中任何受支持的重音字符的最后/首名。

我的另一种方法是使用. 字符类,有一个更简单的expression式:

 var regex = /^.+,\s.+$/; 
  • 这可以匹配任何东西,至less是以something, somethingforms出现的something, something 。 没关系我想…

我刚发现的最后一种方法可能会更简单…

 /^[a-zA-Z\u00C0-\u017F]+,\s[a-zA-Z\u00C0-\u017F]+$/ 
  • 它匹配一系列unicode字符 – 经过testing和工作,虽然我没有尝试任何疯狂的东西,只是我在我们的语言部门为教职员姓名看到的正常东西。

这是我的担忧:

  1. 第一个解决scheme太有限了,在这方面马虎而曲折。 如果我忘记了一两个字符,就需要改变,这样做不是很实际。
  2. 第二个解决scheme更好,更简洁,但可能比实际应用要多得多。 我找不到任何真正的文件. 只匹配“除换行符之外的任何字符”(来自MDN上的一个表)。
  3. 第三个解决scheme似乎是最精确的,但是有什么问题吗? 我对Unicode并不是很熟悉,至less在实践中,但是看看\u00C0-\u017F 表的代码表 / 延续 ,至less对于我的预期input来说, \u00C0-\u017F似乎是相当稳固的。

    • 教师不会用自己的母语(如阿拉伯语,中文,日语等)提交表格,所以我不必担心拉丁字母以外的字符

所以真正的问题是 :这三种方法中的哪一种最适合这项任务? 还是有更好的解决scheme?

这三种方法中的哪一种最适合这项任务?

取决于任务:-)要完全匹配所有拉丁字符及其重音版本,Unicode范围可能提供最佳解决scheme。 它们可能扩展到所有非空白字符,这可以使用\S字符类来完成。

我迫使UI中的字段匹配格式: last_name, first_name (last [comma space] first)

我在这里看到的最基本的问题不是变音符号,而是空白符号。 有几个名称由多个词组成,例如标题。 所以你应该用最通用的方式去做,那就是允许除了和姓氏区别开来的逗号之外的所有东西:

 /[^,]+,\s[^,]+/ 

但你的第二个解决scheme. 字符类是一样好,你只需要关心多个逗号然后。

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

 [A-zÀ-ú] // accepts lowercase and uppercase characters [A-zÀ-ÿ] // as above but including letters with an umlaut 

XRegExp库有一个名为Unicode的插件 ,可以帮助解决这样的任务。

 <script src="xregexp.js"></script> <script src="addons/unicode/unicode-base.js"></script> <script> var unicodeWord = XRegExp("^\\p{L}+$"); unicodeWord.test("Русский"); // true unicodeWord.test("日本語"); // true unicodeWord.test("العربية"); // true </script> 

在这个问题的评论中提到,但很容易错过。 我只是在提交这个答案后才注意到它。

重音拉丁范围\u00C0-\u017F是不够我的数据库的名称,所以我扩展正则expression式[a-zA-Z\u00C0-\u024F]

如果你需要更多的代码点,你可以在Wikipedia的Unicode字符列表中find更多的范围。

原来的正则expression式停在了“Şenol”这个名字上。 根据FontSpace的Unicode分析器 ,第一个字符是\u0218 ,下面是\u0218字母“L”。 (是的,通常拼写为cedilla-S“u”,“Şenol”,但我不会告诉他,“你的名字拼错了!”)

这个怎么样?

 /^[a-zA-ZÀ-ÖØ-öø-ÿ]+$/ 

从这个wiki: https : //en.wikipedia.org/wiki/List_of_Unicode_characters#Basic_Latin

拉丁字母,我使用

 /^[A-zÀ-ÖØ-öø-ÿ]+$/ 

它避免了连字符和特殊字符