重音字符(变音符号)的具体Javascript正则表达式
我已经研究了堆栈溢出(,等等),但还没有找到这个问题的具体答案:重音字符(变音符号)的具体Javascript正则表达式,javascript,regex,unicode,Javascript,Regex,Unicode,我已经研究了堆栈溢出(,等等),但还没有找到这个问题的具体答案: JavaScript如何匹配重音字符(带有变音符号的字符)? 我正在强制UI中的一个字段匹配格式:last\u name,first\u name(last[comma space]first),我想提供对变音符号的支持,但显然在JavaScript中,它比其他语言/平台更难 这是我的原始版本,直到我想添加变音符号支持: /^[a-zA-Z]+,\s[a-zA-Z]+$/ 目前,我正在讨论添加支持的三种方法之一,所有这些方法我都已
JavaScript如何匹配重音字符(带有变音符号的字符)?
我正在强制UI中的一个字段匹配格式:last\u name,first\u name
(last[comma space]first),我想提供对变音符号的支持,但显然在JavaScript中,它比其他语言/平台更难
这是我的原始版本,直到我想添加变音符号支持:
/^[a-zA-Z]+,\s[a-zA-Z]+$/
目前,我正在讨论添加支持的三种方法之一,所有这些方法我都已经测试过并工作过(至少在某种程度上,我真的不知道第二种方法的“范围”是什么)。这是:
明确列出我希望接受为有效的所有重音字符(蹩脚且过于复杂):
- 这会将姓氏/名与
重音字符中支持的任何重音字符正确匹配
我的另一种方法是使用
字符类,以获得更简单的表达式:
- 这几乎可以匹配任何东西,至少以:
的形式。没关系,我想something,something
最后一种方法,我可能更简单。。。
- 它匹配了一系列unicode字符——经过测试并正常工作,尽管我没有做任何疯狂的尝试,只是我在语言系看到的关于教员姓名的普通东西
以下是我关注的问题:
匹配内容的真实文档,只找到了“除换行符以外的任何字符”的泛化(来自上表)\u00C0-\u017F
似乎非常可靠,至少对于我预期的输入来说是这样
- 教员不会提交以母语(如阿拉伯语、汉语、日语等)填写姓名的表格,因此我不必担心拉丁字符集以外的字符
那么真正的问题是:这三种方法中哪一种最适合这项任务?还是有更好的解决方案 这三种方法中哪一种最适合此任务 取决于任务:-)为了精确匹配所有拉丁字符及其重音版本,Unicode范围可能提供最佳解决方案。它们可以扩展到所有非空白字符,这可以使用
\S
字符类来完成
我正在强制UI中的一个字段匹配以下格式:last\u name,first\u name
(last[逗号空格]first)
我在这里看到的最基本的问题不是变音符号,而是空格。有几个名称由多个单词组成,例如标题。因此,您应该使用最通用的方法,即除了区分名字和姓氏的逗号之外,允许使用任何其他名称:
/[^,]+,\s[^,]+/
但是您使用
字符类的第二个解决方案同样好,您可能只需要关心多个逗号。接受所有重音的更简单方法是:
[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 [ ] ^ \ × ÷
有关按数字顺序列出的字符,请参见。该库提供了帮助解决此类任务的工具
<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>
var unicodeWord=XRegExp(“^\\p{L}+$”);
杜沃德测试(“敻敻敻敻”);//真的
德沃德测试(“日本語"); // 真的
unicodeWord.test(“العبي㶡”)//正确
在对问题的评论中提到了它,但它很容易被忽略。我只是在提交了这个答案后才注意到它。重音拉丁语范围
\u00C0-\u017F
对于我的姓名数据库来说不够,所以我将正则表达式扩展到
[a-zA-Z\u00C0-\u024F]
[a-zA-Z\u00C0-\u024F\u1E00-\u1EFF] // includes even more Latin chars
我添加了这些代码块(\u00C0-\u024F
同时包括三个相邻的块):
\u00C0-\u00FF
\u0100-\u017F
\u0180-\u024F
\u1E00-\u1EFF
\u00C0-\u00FF
实际上只是的一部分。它跳过不可打印的控制信号和所有符号,但笨拙放置的乘法×\u00D7
和除法÷\u00F7
除外
[a-zA-Z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u024F] // exclude ×÷
如果你需要更多的代码点,你可以在维基百科上找到更多的范围。例如,你也可以添加,和,但我把它们删掉了,因为现在似乎只有历史学家对它们感兴趣,而且D和E集在我的浏览器中甚至不能正确呈现
最初停在\u017F
的正则表达式是以“Șenol”这个名字命名的。据我所知,第一个字符是\u0218
,拉丁文大写字母S,下面加逗号。(是的,它通常拼写为cedilla-S\u015E
,“Şenol.”但我不会飞到土耳其去告诉他,“你的名字拼错了!”)来自此wiki:
对于拉丁字母,我使用
/^[A-zÀ-ÖØ-öø-ÿ]+$/
它避免了连字符和特殊字符这个怎么样
/^[a-zA-ZÀ-ÖØ-öø-ÿ]+$/
^([a-zA-Z]|[à-ú]|[À-Ú])+$
这个怎么样
/^[a-zA-ZÀ-ÖØ-öø-ÿ]+$/
^([a-zA-Z]|[à-ú]|[À-Ú])+$
它将匹配每个单词是否带有重音字符
/^[\pL\pM\p{Zs}.-]+$/u
说明:
-匹配来自任何语言的任何类型的字母\pL
-将一个字符与另一个字符(例如重音符号、元音、包围盒等)组合在一起\pM
-匹配不可见但占用空间的空白字符\p{Zs}
-模式和主题字符串被视为UTF-8u
/^[\pL\pM\p{Zs}.-]+$/u