hash = window.location.hash.substr(1);
var reg = new RegExp('^[0-9]$');
console.log(reg.test(hash));

“123”和“123f”都是假的。我想检查哈希是否只包含数字。我错过什么了吗?


当前回答

这个函数检查它的输入是否是经典意义上的数字,因为人们期望正常的数字检测函数能够工作。

这是一个可以用于HTML表单输入的测试。

它绕过了所有JS的民俗,比如tipeof(NaN) = number, parseint('1 Kg') = 1,布尔值被强制转换为数字,等等。

它通过将参数呈现为字符串,并根据@codename之类的正则表达式检查该字符串-但允许像5这样的条目。和5

function isANumber( n ) {
    var numStr = /^-?(\d+\.?\d*)$|(\d*\.?\d+)$/;
    return numStr.test( n.toString() );
}

not numeric:
Logger.log( 'isANumber( "aaa" ): ' + isANumber( 'aaa' ) );
Logger.log( 'isANumber( "" ): ' + isANumber( '' ) );
Logger.log( 'isANumber( "lkjh" ): ' + isANumber( 'lkjh' ) );
Logger.log( 'isANumber( 0/0 ): ' + isANumber( 0 / 0 ) );
Logger.log( 'isANumber( 1/0 ): ' + isANumber( 1 / 0 ) );
Logger.log( 'isANumber( "1Kg" ): ' + isANumber( '1Kg' ) );
Logger.log( 'isANumber( "1 Kg" ): ' + isANumber( '1 Kg' ) );
Logger.log( 'isANumber( false ): ' + isANumber( false ) );
Logger.log( 'isANumber( true ): ' + isANumber( true ) );

numeric:
Logger.log( 'isANumber( "0" ): ' + isANumber( '0' ) );
Logger.log( 'isANumber( "12.5" ): ' + isANumber( '12.5' ) );
Logger.log( 'isANumber( ".5" ): ' + isANumber( '.5' ) );
Logger.log( 'isANumber( "5." ): ' + isANumber( '5.' ) );
Logger.log( 'isANumber( "-5" ): ' + isANumber( '-5' ) );
Logger.log( 'isANumber( "-5." ): ' + isANumber( '-5.' ) );
Logger.log( 'isANumber( "-.5" ): ' + isANumber( '-5.' ) );
Logger.log( 'isANumber( "1234567890" ): ' + isANumber( '1234567890' ));

正则表达式的解释:

/^-?(\d+\.?\d*)$|(\d*\.?\d+)$/  

开头的“^”和结尾的“$”匹配字符串的开头和结尾,以确保检查横跨整个字符串。“-?”部分是带有“?”乘数的负号,它允许零或一个实例。

然后还有两个类似的组,用圆括号分隔。字符串必须匹配这两个组中的任意一个。第一个匹配5这样的数字。第二个。5

第一组是

\d+\.?\d*

“\d+”与数字(\d)匹配一次或多次。 “\.?”是小数点(用“\”转义,以消除它的魔力),0次或1次。

最后一部分“\d*”也是一个数字,0次或多次。 除了第一个数字,其他部分都是可选的,所以这个组匹配5这样的数字。而不是和另一半匹配的。5。

其他回答

var validation = {
    isEmailAddress:function(str) {
        var pattern =/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
        return pattern.test(str);  // returns a boolean
    },
    isNotEmpty:function (str) {
        var pattern =/\S+/;
        return pattern.test(str);  // returns a boolean
    },
    isNumber:function(str) {
        var pattern = /^\d+\.?\d*$/;
        return pattern.test(str);  // returns a boolean
    },
    isSame:function(str1,str2){
        return str1 === str2;
    }
};   

alert(validation.isNotEmpty("dff"));
alert(validation.isNumber(44));
alert(validation.isEmailAddress("mf@tl.ff"));
alert(validation.isSame("sf","sf"));

\d将不匹配小数点。小数用下面的形式表示。

const re = /^\d*(\.\d+)?$/
'123'.match(re)       // true
'123.3'.match(re)     // true
'123!3'.match(re)     // false

如果数字不是特别大,可以用:

new RegExp(
    '^' +                           // No leading content.
    '[-+]?' +                       // Optional sign.
    '(?:[0-9]{0,30}\\.)?' +         // Optionally 0-30 decimal digits of mantissa.
    '[0-9]{1,30}' +                 // 1-30 decimal digits of integer or fraction.
    '(?:[Ee][-+]?[1-2]?[0-9])?' +   // Optional exponent 0-29 for scientific notation.
    '$'                             // No trailing content.
)

这试图避免一些场景,以防万一:

溢出原始字符串可能传递到的任何缓冲区。 由1E-323等非正常数字引起的缓慢或异常。 当期望有一个有限的数字时通过无穷大(尝试1E309或-1E309)。

这个函数也允许有符号和浮点数或空字符串:

var reg = /^-?\d*\.?\d*$/

如果你不想让空字符串使用这个:

var reg = /^-?\d+\.?\d*$/

简单的Regex javascript

var cnpj = "12.32.432/1-22";
var rCnpj = cnpj.replace(/\D/gm,"");
console.log(cnpj);

*结果:

1232432122

只检查数字:

if(rCnpj === cnpj){
   return true;
}

简单的例子

if("12.32.432/1-22".replace(/\D/gm,"").length > 0){
   console.log("Ok.");
}