为什么正则表达式的西里尔字母错过了一个字母?

时间:2014-11-04 09:05:53

标签: javascript html regex

我想在html页面中验证文本输入字段以仅接受西里尔字母。我使用正则表达式在JavaScript中编写了验证代码,如下所示:

var namevalue = document.getElementById("name")
var letters = /^[А-Яа-я]+$/;
if (namevalue.matches(letters)) {
  alert("Accepted");
}
else {
  alert("Enter only cyrillic letters");
}

此代码适用于除Ёё

以外的所有西里尔字母

3 个答案:

答案 0 :(得分:3)

ё无效的问题,因为它超出范围Aа-ЯяAа-Яа位于基本西里尔字母 [0430-044F]中,但ё不在基本西里尔字母中。 ё属于 Cyrillic扩展 [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规范中。没有简单明了的解决方案。因此,对于强大的编程,您需要始终为此类情况做好准备。

答案 1 :(得分:1)

Ë不一定是西里尔字母中的字母,因此不会出现在您使用的А-Яа-я范围内。

您的Ë Cyrillic:U+0401还是拉丁语:U+00CB

如果您还希望捕获非西里尔文Ë,则可能需要将此范围添加到正则表达式中:À-ÿ



alert(JSON.stringify("Ëë".match(/^[À-ÿ]+$/)))




如果您只想抓住西里尔字母中的Ë,请尝试以下操作:

而不是在U+0410А)开始您的范围,而是在U+0400Ѐ)处开始,并以U+045F结束{{1 }}):



џ




(最后一个范围应包括完整的西里尔字母。)

来源:Unicode character codes.您可以使用此页面查看需要添加到正则表达式的范围。

答案 2 :(得分:1)

你可以找到ёЁ的西里尔文扩展而不是А-Яа-яt