在 JavaScript 中检查字母数字的最佳方法

IT技术 javascript validation
2021-03-14 11:29:05

对 中的INPUT字段执行字母数字检查的最佳方法是什么JSP我附上了我当前的代码

function validateCode() {
    var TCode = document.getElementById("TCode").value;

    for (var i = 0; i < TCode.length; i++) {
        var char1 = TCode.charAt(i);
        var cc = char1.charCodeAt(0);

        if ((cc > 47 && cc < 58) || (cc > 64 && cc < 91) || (cc > 96 && cc < 123)) {
        } else {
            alert("Input is not alphanumeric");
            return false;
        }
    }

    return true;
}

6个回答

你可以使用这个正则表达式 /^[a-z0-9]+$/i

测试正则表达式似乎比charCodeAt(). 请参阅下面的jsPerf我的回答
2021-04-18 11:29:05
ñ 不属于模式但是完全有效的 UTF-8 字符。
2021-04-27 11:29:05
/^[a-z0-9]+$/i.test( TCode )
2021-04-27 11:29:05
当然,这假定""不应匹配空字符串 ( )。
2021-04-30 11:29:05
此正则表达式不适用于某些语言中使用的特殊字符字母,例如“ą”、“ź”、“ć”等。
2021-05-10 11:29:05

提问者最初倾向于使用str.charCodeAt(i)似乎比正则表达式替代方案更快。我对 jsPerf测试中, RegExp 选项在 Chrome 36 中的执行速度慢了 66%(在 Firefox 31 中稍慢)。

这是原始验证代码的清理版本,它接收一个字符串并返回trueor false

function isAlphaNumeric(str) {
  var code, i, len;

  for (i = 0, len = str.length; i < len; i++) {
    code = str.charCodeAt(i);
    if (!(code > 47 && code < 58) && // numeric (0-9)
        !(code > 64 && code < 91) && // upper alpha (A-Z)
        !(code > 96 && code < 123)) { // lower alpha (a-z)
      return false;
    }
  }
  return true;
};

当然,可能还有其他的考虑,比如可读性。单行正则表达式肯定更漂亮。但是,如果您严格关注速度,则可能需要考虑这种替代方案。

程序员喜欢代码的外观,但你会看到它的内在美。
2021-04-19 11:29:05
让你思考并让你理解“编程”意味着什么的答案。我用你的思维方式,在我的回答中
2021-04-28 11:29:05
有趣的替代方法 - 我什至从未想过。我来到这里时只考虑了正则表达式!
2021-05-04 11:29:05
为什么我们需要在 charCode 中进行比较charCodeAt我们不能只与字符串 char (c >= '0' && c <= '9'), (c >= 'a' && c <= 'z'),进行字符串比较(c >= 'A' && c <= 'Z')吗?
2021-05-13 11:29:05

用正则表达式检查它。

Javascript regexen 没有 POSIX 字符类,因此您必须手动编写字符范围:

if (!input_string.match(/^[0-9a-z]+$/))
  show_error_or_something()

这里^表示字符串的开始,表示字符串的$结束,[0-9a-z]+表示一个或多个字符 from 0to 9OR from ato z

有关 Javascript regexen 的更多信息,请访问:https : //developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions

+1 用于解释基本正则表达式并链接到指南,而不是给用户一个“魔法字符串”。
2021-04-27 11:29:05
@inor 您可以在正则表达式的末尾添加“i”以指定不区分大小写,.ie /^[a-z0-9]+$/i,这将涵盖小写和大写字母
2021-05-04 11:29:05

你不需要一次做一个。只需对不是字母数字的任何内容进行测试如果找到,则验证失败。

function validateCode(){
    var TCode = document.getElementById('TCode').value;
    if( /[^a-zA-Z0-9]/.test( TCode ) ) {
       alert('Input is not alphanumeric');
       return false;
    }
    return true;     
 }

如果至少有一个非字母数字的匹配项,它将return false.

要匹配所有 Unicode 字母和数字,您可以使用 Unicode 正则表达式:

const alphanumeric = /^[\p{L}\p{N}]*$/u;

const valid   = "Jòhn꠵Çoe日本語3rd"; // <- these are all letters or numbers
const invalid = "JohnDoe3rd!";

console.log(valid.match(alphanumeric));
console.log(invalid.match(alphanumeric));

在上面的正则表达式中,u标志启用Unicode 模式\p{L}是短期的\p{Letter}\p{N}短暂的\p{Number}[]它们周围的方括号是一个普通的字符类,这意味着字符必须是字母或数字(在这种情况下)。*是“零个或多个”,你可以切换到该+(一个或多个),如果你不希望允许空字符串。^/$匹配字符串的开始/结束。


以上对于大多数情况就足够了,但可能比您想要的更多。您可能不想匹配拉丁文、阿拉伯文、西里尔文等。您可能只想匹配拉丁字母和十进制数字。

const alphanumeric = /^[\p{sc=Latn}\p{Nd}]*$/u;

const valid   = "JòhnÇoe3rd";
const invalid = "Jòhn꠵Çoe日本語3rd";

console.log(valid.match(alphanumeric));
console.log(invalid.match(alphanumeric));

\p{sc=Latn}是 的缩写\p{Script=Latin}\p{Nd}\p{Decimal_Number}小数的缩写并匹配小数。与 的不同之\d处在于\p{Nd}不仅匹配5,而且还匹配𝟓并且可能更多。

查看正则表达式 Unicode 文档以获取详细信息,可用\p选项链接在文档页面上。

请注意,Internet Explorer 不支持u标志