用于删除,箭头和转义键的正则表达式模式

Jam*_*mex 7 javascript regex

我正在编写一个javascript代码来限制可以输入文本框的密钥.

function keyRestricted(e) {
    var keypressed;
    var keychar;
    var keycheck;
    // IE - keyCode
    // Netscape/Firefox/Opera - which
    keypressed = e.keyCode || e.which;
    keychar = String.fromCharCode(keypressed);
    //alert(keychar);
    keycheck = /[a-zA-Z0-9\b]/;
    return keycheck.test(keychar);
} //keyrestricted
Run Code Online (Sandbox Code Playgroud)

我的正则表达式现在/[a-zA-Z0-9\b]/,它允许字母数字和退格.我想允许删除,L/R箭头和转义键在Firefox(3.6)中工作.

我不确定这些键的符号是什么.

在ie8中,即使从正则表达式中排除\ e开关,转义键(和del /箭头)仍处于活动状态,按下时,它会重置/清空文本框.

在FF中,我将转义放在表达式中/[a-zA-Z0-9\b\e]/,但它似乎对firefox不起作用,即当按下转义键时,它不会重置/清空文本框.

正则表达式的有效符号是什么,允许使用字母数字,L/R箭头,删除,转义?

另外,这个翻译是[a-zA-Z0-9\-\_]什么?它的意思是字母数字和连字符.但是连字符前面的斜线是什么,因为连字符不需要斜线?什么是\_for,因为下划线与表达式不匹配?

TIA

编辑

使用nnnnn建议的密钥代码的原因对我来说不适用(对于其他人?)是因为65-90的密钥代码是大写字母,即使有些网站确实声称这些密钥代码适用于大写和大写字母.

这个http://www.lookuptables.com/网站显示小写字母是97-122.不幸的是,这个范围与一些字符有一些未映射的重叠.例如,\字符被列为具有220个键码.但我的过滤器去激活密钥代码> 122仍然允许\通过.还有其他例子.

我使用笔记本电脑键盘和外接全尺寸键盘对此进行了测试.

编辑2

我将正则表达式和keycode参数合并到一个函数中.该函数原则上起作用,但由于疯狂的键码冲突,它不适用于%符号.它需要onkeydown和onkeypress来捕获所有键(%键除外).请参阅我在此讨论javascript正则表达式以获取关键事件输入验证疑难解答帮助

<head>
<script type="text/javascript">
function keyRestricted(evt) {
    var theEvent = evt || window.event;
    var key = theEvent.keyCode || theEvent.which;
    var keychar = String.fromCharCode(key);
    //alert(keychar);
    var keycheck = /[a-zA-Z0-9]/;
    // backspace || delete || escape || arrows
    if (!(key == 8 || key == 27 || key == 46 || key == 37 || key == 39)) {
        if (!keycheck.test(keychar)) {
            theEvent.returnValue = false; //for IE
            if (theEvent.preventDefault) theEvent.preventDefault(); //Firefox
        }
    }
}
</script>
</head>
<body>
    Please modify the contents of the text field.
    <input 
        type="text" value="" 
        onKeypress="return keyRestricted(event)" 
        onKeydown="return keyRestricted(event)" 
    />
</body>
Run Code Online (Sandbox Code Playgroud)

nnn*_*nnn 10

据我所知,正则表达式 - 或者至少是JavaScript版本 - 不允许你测试一些"特殊"字符,如转义和箭头键(虽然我相信你可以测试退格).

我更喜欢用标准if声明来实现这种事情:

var keypressed = e.which || e.keyCode;

if ((keypressed >=65 && keypressed <= 90) // letters
    || (keypressed >=48 && keypressed <= 57) // digits
    || keypressed === 8 // backspace
    || keypressed === 27 // escape
    || keypressed === 46 // delete
    || (keypressed >= 35 && keypressed <= 40) // end, home, arrows
    // TODO: shift, ctrl, alt, caps-lock, etc
    ) {
  // do something
}

// If the keys you care about don't follow any particular pattern
// a switch might be more convenient:
switch (keypressed) {
  case 8:
  case 27:
  case 46:
     // valid key, do something
     break;
  default:
     // invalid key, do something else
     break;
}


// You can also do something like this:    
var permittedKeyCodes = {
  "8" : true,  // backspace
  "27" : true, // escape
  "46" : true  // delete
};
if (permittedKeyCodes[keypressed]) {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

如果使用后一种方法,则在permittedKeyCodes函数外定义对象会更有效.

有各种各样的地方(这里是一个),您可以在其中获得所有密钥代码的列表.

请注意,如果您正在捕获keydown或keyup事件,则返回的密钥代码与密钥相关联,而不是字符,因此例如,大写和小写A都具有相同的代码.按键事件的工作方式不同.