在Java中进行字母数字检查的最佳方法


107

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

<script type="text/javascript">
  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;     
   }


2
取决于您如何定义“最佳”。以下大多数答案都建议使用正则表达式,它的执行速度比原始代码慢得多。我已经整理了一下您的代码,实际上效果很好。
2014年

Answers:


100

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


4
当然,这假定""不应该匹配空字符串()。
zzzzBov 2010年

15
ñ不会落入该模式,但是完全有效的UTF-8字符。
Oybek

8
/ ^ [a-z0-9] + $ / i.test(TCode)
Alex V

3
测试正则表达式似乎比慢得多(在Chrome 36中为66%)charCodeAt()。请参阅下面的jsPerf我的答案
Michael Martin-Smucker 2014年

5
此正则表达式不适用于某些语言中使用的特殊字符字母,例如“±”,“ź”,“ć”等。
RafałSwacha

79

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

这是原始验证代码的清理版本,该版本接收字符串并返回truefalse

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;
};

当然,可能还有其他考虑因素,例如可读性。单行正则表达式绝对值得一看。但是,如果您严格考虑速度,则可能需要考虑这种替代方法。


17
程序员喜欢代码的外观,但是您会看到它的内在美。
Ziggy 2014年

有趣的替代方法-甚至从未想过。我来到这里时只想到了正则表达式!
ozzy432836

这个答案使您思考并理解“编程”的含义。我用你的思维方式回答
奥斯卡·扎鲁斯

42

用正则表达式检查。

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

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

这里^表示字符串的开头,表示字符串$的结尾,[0-9a-z]+表示从0to到9OR或从a到to的一个或多个字符z

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


14
+1用于解释基本的正则表达式并链接到指南,而不是给用户一个“魔术字符串”。
查尔斯·伯恩斯

4
@inor,您只需在正则表达式的末尾添加'i'即可指定不区分大小写的字符,即.ie /^[a-z0-9]+$/i,这将覆盖大小写字母
LJH

33

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

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


6

我将创建一个String原型方法:

String.prototype.isAlphaNumeric = function() {
  var regExp = /^[A-Za-z0-9]+$/;
  return (this.match(regExp));
};

然后,用法为:

var TCode = document.getElementById('TCode').value;
return TCode.isAlphaNumeric()


2
DJDavid98:我认为“不要修改您不拥有的对象”规则在这里不适用。贾斯汀只是在扩展String的功能,而没有修改现有功能。从角度来看,在C#世界中,这将被视为扩展方法的完美有效用法。即使某天“ String.isAlphaNumeric():boolean”将由浏览器制造商实施,但签名和动作实际上都不会改变,因此在此特定示例中,我看不到可维护性的任何降低。某些事情是规则,并不意味着没有例外。
RistoVälimäki2015年

5
    // On keypress event call the following method
    function AlphaNumCheck(e) {
        var charCode = (e.which) ? e.which : e.keyCode;
        if (charCode == 8) return true;

        var keynum;
        var keychar;
        var charcheck = /[a-zA-Z0-9]/;
        if (window.event) // IE
        {
            keynum = e.keyCode;
        }
        else {
            if (e.which) // Netscape/Firefox/Opera
            {
                keynum = e.which;
            }
            else return true;
        }

        keychar = String.fromCharCode(keynum);
        return charcheck.test(keychar);
    }

此外,本文还有助于理解JavaScript字母数字验证。


3

对不起,没有争议。但是,对于这些年来随着我的成长而成长的社区来说,做些笔记是一件好事。

真正的字母数字字符串是like "0a0a0a0b0c0d"和not like "000000""qwertyuio"

我在这里阅读的所有答案true在两种情况下均返回。恕我直言,这是不对的

如果我想检查我的"00000"字符串是否为字母数字,那么我的“人类”答案无疑是假的。

为什么?简单。我找不到任何字母char。因此,是一个简单的数字字符串[0-9]

另一方面,如果我想检查我的"abcdefg"字符串,我的“人为”答案甚至为FALSE。我没有看到数字,所以它不是字母数字。只是阿尔法[a-zA-Z]

迈克尔·马丁-斯马克的答案已经被照亮。

但是,他的目标是获得更好的性能而不是正则表达式。的确如此,使用低级别的方法可以获得更好的性能。但是结果是一样的。字符串"0123456789"(仅数字),"qwertyuiop"(仅字母)和"0a1b2c3d4f4g"(字母数字)TRUE以字母数字形式返回。同样的正则表达式/^[a-z0-9]+$/i方式。正则表达式不起作用的原因很简单。语法[]指示or,而不指示and。因此,如果仅是数字还是仅是字母,则regex返回true

但是,Michael Martin-Smucker的答案仍然很有启发性。为了我。它使我可以“低级”思考,创建一个真正的函数,可以明确地处理字母数字字符串。我把它称为PHP相对函数ctype_alnum编辑2020-02-18:但是,在此检查OR而不是AND)。

这是代码:

function ctype_alnum(str) {
  var code, i, len;
    var isNumeric = false, isAlpha = false; //I assume that it is all non-alphanumeric



  for (i = 0, len = str.length; i < len; i++) {
    code = str.charCodeAt(i);


        switch (true){
            case code > 47 && code < 58: // check if 0-9
                isNumeric = true;
                break;
            case (code > 64 && code < 91) || (code > 96 && code < 123): //check if A-Z or a-z
                isAlpha = true;
                break;
            default: // not 0-9, not A-Z or a-z
                return false; //stop function with false result, no more checks

        }

  }

  return isNumeric && isAlpha; //return the loop results, if both are true, the string is certainly alphanumeric
};

...这是演示

我之所以参加此讨论,是因为我正在寻找JavaScript替代PHP函数的方法。我没有找到“准备就绪”的答案,但是就像Stackoverflow上经常发生的那样,知识和彼此比较的概念是一种崇高的思想,它使您思考某人的答案一起找到您曾经的解决方案。寻找,但您不认为自己知道。

分享吧!

最好

奥斯卡奖


上面的解决了alphaAndNumeric,而不是alphaNumeric。return isNumeric || isAlpha;是alphaNumeric。以上内容可能对某些人有所帮助。
TamusJRoyce,

1
@TamusJRoyce当然。但是图像要检查一些增值税号,在某些情况下只是数字,而在其他情况下必须是字母和数字。顺便说一下,我的错,就是现在才意识到,相对的PHP函数预见到OR而不是AND。这是一个问题,因为我不得不修改我的PHP应用程序的所有代码,创建为AND提供的即席函数
Oscar Zarrus

3

在一个紧密的循环中,最好避免使用正则表达式并对字符进行硬编码:

const CHARS = new Set("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
function isAlphanumeric(char) {
    return CHARS.has(char);
}

您能解释一下吗
lazydeveloper

2
循环扫描整个字符串时,此代码为O(N ^ 2),甚至比出现的最差的正则表达式解决方案(例如,用户传递所有'Z',indexOf()必须扫描到每个字符结尾)。这不仅可能会导致扫描整个0-Z字符串的开销(每个调用平均执行18个字符比较),而且还会导致两个函数调用的源字符串的每个字符开销,这是一个相当大的恒定时间值!该代码甚至可能会根据使用位置而引入DoS漏洞。
CubicleSoft

1
您绝对正确的CubicleSoft。我更新了使用JS Set的答案。
马尔加尼斯

0

要检查input_string是否为字母数字,只需使用:

input_string.match(/[^\w]|_/) == null
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.