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

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


当前回答

如果你想用带符号的值匹配数字,你可以使用:

var reg = new RegExp('^(\-?|\+?)\d*$');

它将验证格式的数字:+1,-1,1。

其他回答

var reg = /^\d+$/;

应该这么做。原始值匹配任何恰好包含一个数字的值。

只有数字的正则表达式(已更新)

 var reg = new RegExp('[^0-9]','g');

这对你的目的来说太过分了:

const numberReSnippet = "NaN|-?((\d*\.\d+|\d+)([Ee][+-]?\d+)?|Infinity)";
const matchOnlyNumberRe = new RegExp("^("+ numberReSnippet + ")$");

据我所知,这与Java和JavaScript提供给您的所有数字变体相匹配,包括“-Infinity”、“1e-24”和“NaN”。它还可以匹配您可能键入的数字,例如“-.5”。

正如所写的,numberReSnippet被设计为被放入其他正则表达式中,因此您可以提取(或避免)数字。尽管有括号,但它不包含捕获组。因此"matchOnlyNumberRe"只匹配数字类型的字符串,并为整个字符串设置了一个捕获组。

下面是Jasmine测试,你可以看到它能处理什么,不能处理什么:

describe("Number Regex", function() {
    const re = matchOnlyNumberRe;
    it("Matches Java and JavaScript numbers", function() {
        expect(re.test(         "1")).toBe(true);
        expect(re.test(       "0.2")).toBe(true);
        expect(re.test(     "0.4E4")).toBe(true);  // Java-style
        expect(re.test(       "-55")).toBe(true);
        expect(re.test(      "-0.6")).toBe(true);
        expect(re.test(  "-0.77E77")).toBe(true);
        expect(re.test(      "88E8")).toBe(true);
        expect(re.test(       "NaN")).toBe(true);
        expect(re.test(  "Infinity")).toBe(true);
        expect(re.test( "-Infinity")).toBe(true);
        expect(re.test(     "1e+24")).toBe(true);  // JavaScript-style
    });
    it("Matches fractions with a leading decimal point", function() {
        expect(re.test(        ".3")).toBe(true);
        expect(re.test(       "-.3")).toBe(true);
        expect(re.test(     ".3e-4")).toBe(true);
    });
    it("Doesn't match non-numbers", function() {
        expect(re.test(         ".")).toBe(false);
        expect(re.test(        "9.")).toBe(false);
        expect(re.test(          "")).toBe(false);
        expect(re.test(         "E")).toBe(false);
        expect(re.test(       "e24")).toBe(false);
        expect(re.test(   "1e+24.5")).toBe(false);
        expect(re.test("-.Infinity")).toBe(false);
        expect(re.test(      "8|24")).toBe(false);
    });
});

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

这是一个可以用于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。

在输入时,如果你想过滤掉其他字符,只显示输入字段中的数字,你可以在keyup上替换字段的值:

    var yourInput = jQuery('#input-field');
    yourInput.keyup(function() {
        yourInput.val((yourInput.val().replace(/[^\d]/g,'')))
    })