我正在使用正则表达式来防止将字母以外的字符写入文本区域:
/[A-Za-Z]/ig
但它抛出了这个与正则表达式相关的错误:
字符类中的范围乱序
为什么会这样?
window.addEventListener("DOMContentLoaded", checker);
function checker() {
var textArea = document.getElementsByTagName("textarea");
for (let element of textArea) {
element.addEventListener("keypress", event => {
var letra = "which" in event ? event.which : event.keyCode,
patron = /[A-Za-Z]/ig;
if (!patron.test(letra)) {
event.preventDefault();
return false;
}
});
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<textarea cols="40" rows="10"></textarea></textarea>
</body>
</html>
错误“字符类中的范围乱序”表示在字符类中,有一个范围颠倒了。在字符类中,您可以使用任何范围,例如
[!-z]
,[#-@]
或任何您想要的,只要第一个字符值小于第二个字符值。- 我们通常谈论ASCII 码,因为基本拉丁块是我们使用最多的一个,但它也适用于 Unicode 中的任何码点值,而不仅仅是 0 到 127 之间最常见的码点值。
产生错误的原因有 3 个:
-
,但它没有被转义。示例:当您想匹配其中一个符号
[,-!"#]
时,必须对连字符进行转义,以免生成范围,例如[,\-!"#]
(或在类的开头或结尾,它永远不是范围)。示例:要匹配文本
"[ax - b]"
,必须对前括号进行转义,以便它不会生成类,例如\[ax - b]
.[a-Z]
.在您的情况下,
a-Z
这是错误的,因为 laa
的值为 97 而 laZ
的值为 90 (它是向后的)。相反,它可以是,[Z-a]
其中包括字符Z
、[
、\
、]
、^
、_
和。-我知道,这可能只是一个错字,但我想解释一下。`
a
匹配从 a 到 z 的大写或小写字母的正则表达式是
/^[A-Za-z]$/
.或者,有什么相同的(如果我们使用开关
/i
忽略大小写):/^[a-z]$/i
但我们不要忘记西班牙语中的ñ和重音元音:
正则表达式错误是因为您在字符AZ和aZ中包含了 ,并且没有字符范围aZ但az。
另外,正如我看到的代码,您必须使用 event.key
修改后的代码: