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

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


当前回答

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

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

其他回答

/^[\+\-]?\d*\.?\d+(?:[Ee][\+\-]?\d+)?$/

我看到你已经得到了很多答案,但如果你正在寻找一个正则表达式,可以匹配整数和浮点数,这一个将为你工作:

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

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

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+$/;

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

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

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