Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么西里尔字母的正则表达式会漏掉一个字母?_Javascript_Html_Regex - Fatal编程技术网

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"); } 此代码适用

我想验证html页面中的文本输入字段是否只接受西里尔字母。我已经使用如下正则表达式用JavaScript编写了验证代码:

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