Javascript 为什么西里尔字母的正则表达式会漏掉一个字母?
我想验证html页面中的文本输入字段是否只接受西里尔字母。我已经使用如下正则表达式用JavaScript编写了验证代码:Javascript 为什么西里尔字母的正则表达式会漏掉一个字母?,javascript,html,regex,Javascript,Html,Regex,我想验证html页面中的文本输入字段是否只接受西里尔字母。我已经使用如下正则表达式用JavaScript编写了验证代码: var namevalue = document.getElementById("name") var letters = /^[А-Яа-я]+$/; if (namevalue.matches(letters)) { alert("Accepted"); } else { alert("Enter only cyrillic letters"); } 此代码适用
var namevalue = document.getElementById("name")
var letters = /^[А-Яа-я]+$/;
if (namevalue.matches(letters)) {
alert("Accepted");
}
else {
alert("Enter only cyrillic letters");
}
此代码适用于所有西里尔字母,但Ёё除外,
Ë
不一定在西里尔字母表中,因此,不在您使用的范围内
你的Ë
是西里尔语:U+0401
还是拉丁语:U+00CB
如果您还想捕获非西里尔语的Ë
,您可能需要将此范围添加到正则表达式中:À-ÿ
:
alert(JSON.stringify(“Ëë”.match(/^[À-ÿ]+$/)
问题是为什么ё
无法工作,因为它超出了范围AЯ-Я
Aа-Яа
在基本西里尔字母表中[0430-044F]
,但ё
不在基本西里尔字母表中ё
属于西里尔语扩展名[0400-045F]
。因为JavaScript正则表达式引擎不是通过字母本身而是通过字符码进行比较,所以ё
超出了范围
因为我猜你指的是现代俄语,尽管
ё很少见,但仍在广泛使用
我可以建议这个解决方案
var namevalue = document.getElementById("name")
// please note that I added to your pattern "еЁ".
// now this matches all Russian cyrillic letters both small and caps
// plus ё and Ё
var letters = /^[А-Яа-яёЁ]+$/;
if (namevalue.matches(letters)) {
alert("Accepted");
}
else {
alert("Enter only cyrillic letters");
}
不幸的是,
A-Я
和Ё
的问题深深地埋藏在Unicode规范中。没有简单明了的解决办法。因此,对于健壮的编程,您需要时刻为这种情况做好准备。您可以在西里尔语扩展中找到ё,而不是在А-Яа-t中找到ё代码>@MarkZucchini:角色类不是这样工作的。删除|
这可能会有帮助:“仅西里尔文”要求不明确,因为有很多语言使用西里尔文脚本的子集,而在一种语言上有效的字符在另一种语言中不存在。你想匹配哪种语言?是的。问题是为什么ё不起作用,因为它超出了范围A-Я。A-Я是一种基本的西里尔字母[0430-044F],但ё不在该基本字母表中。它是西里尔文的延伸[0400-045F]。因此,javascript正则表达式不是通过字母本身而是通过字符码进行比较,所以ё超出了范围。我不知道如何说明第一个选项。它在视觉上类似于西里尔文的乌姆劳特(U+0451),但它是用拉丁语书写的(这不太可能与西里尔文混合)。我认为你的第二个解决方案可能是OP想要的,但它将包括一堆未使用的西里尔字母。是的,这有点问题。我不熟悉西里尔文,所以我不知道什么字符是,也不使用。如果您是,请建议一个更好的使用范围:-)您将始终使用未使用的西里尔字母,除非您只想适应一种语言。它们都在某种语言中使用(当然它们不可能存在!),但没有一种语言使用它们。还有一件事——这可能是有问题的:并非所有重音西里尔字母都被编码,这意味着你可能需要考虑组合标记。拉丁字母Ë在这种情况下是不相关的。如果你想允许形状与西里尔字母相同的拉丁字母,你需要允许更多;特别允许拉丁语Ë是非常奇怪的。答案的另一部分的问题是允许任意收集西里尔字母,拒绝其中许多字母。这些表达式并不代表所有西里尔字母,但也不代表俄语中使用的一组字母,这显然是其用意。由于JS确保了正确的大小写折叠,因此它可以是简单的/^[а-аё]+$/i
。