具体的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, something
forms出现的something, something
。 没关系我想…
我刚发现的最后一种方法可能会更简单…
/^[a-zA-Z\u00C0-\u017F]+,\s[a-zA-Z\u00C0-\u017F]+$/
- 它匹配一系列unicode字符 – 经过testing和工作,虽然我没有尝试任何疯狂的东西,只是我在我们的语言部门为教职员姓名看到的正常东西。
这是我的担忧:
- 第一个解决scheme太有限了,在这方面马虎而曲折。 如果我忘记了一两个字符,就需要改变,这样做不是很实际。
- 第二个解决scheme更好,更简洁,但可能比实际应用要多得多。 我找不到任何真正的文件
.
只匹配“除换行符之外的任何字符”(来自MDN上的一个表)。 -
第三个解决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À-ÖØ-öø-ÿ]+$/
它避免了连字符和特殊字符