正则表达式检查字符串是否只包含数字

Joh*_*han 252 javascript regex

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

"123"和两者都是假的"123f".我想检查散列是否只包含数字.我错过了什么?

Mik*_*uel 470

var reg = /^\d+$/;
Run Code Online (Sandbox Code Playgroud)

应该这样做.原始文件匹配任何由一个数字组成的内容.

  • @GiuseppePes.真正.它也不处理实数,复数,四元数等.问题与计算数字有关,我的答案也是如此. (11认同)
  • @vsync,因为单引号字符串中的`\ d`是字母'd'.尝试在JavaScript控制台中运行`'/ ^\d + $ /'==='/ ^ d + $ /'`.在字符串中嵌入RegExp时需要双重转义:`eval('/ ^ \\ d + $ /')` (8认同)
  • `/ ^ [\ +\ - ]\d*\\ d +(:?[EE] [\ +\ - ]\d +)???$ /` (6认同)
  • 它没有考虑负数. (4认同)

Abh*_*ogi 94

正如您所说,您希望哈希仅包含数字.

var reg = new RegExp('^[0-9]+$');
Run Code Online (Sandbox Code Playgroud)

要么

var reg = new RegExp('^\\d+$');
Run Code Online (Sandbox Code Playgroud)

\d[0-9]这两个意思是一样的.+ used表示搜索[0-9]中的一个或多个.

  • 这并不完全正确,[0-9] 和 \d 不一样,\d 还匹配其他字符集中的数字字符,例如希伯来语和中文。 (10认同)

cod*_*me- 66

这个也允许使用signed和float数字或空字符串:

var reg = /^-?\d*\.?\d*$/
Run Code Online (Sandbox Code Playgroud)

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

var reg = /^-?\d+\.?\d*$/
Run Code Online (Sandbox Code Playgroud)

  • 如果你不想允许空但想要允许语法如.25使用`var reg =/^ - ?\ d*[\.]?\ d + $ /` (5认同)
  • 为了更好地使用浮点数/^-?\d+(\.\d+)?$/ (2认同)

小智 52

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+$/;
        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"));
Run Code Online (Sandbox Code Playgroud)

  • 非常实用 (3认同)

Dav*_*pik 17

这对你的目的来说极端矫枉过正,但这就是我的用法:

var numberReSnippet = "(?:NaN|-?(?:(?:\\d+|\\d*\\.\\d+)(?:[E|e][+|-]?\\d+)?|Infinity))";
var matchOnlyNumberRe = new RegExp("^("+ numberReSnippet + ")$");
Run Code Online (Sandbox Code Playgroud)

据我所知,这与Java和JavaScript将给你的数字的所有变化相匹配,包括"-Infinity","1e-24"和"NaN".它还匹配您可能键入的数字,例如"-.5".

如上所述,reSnippet被设计为被删除到其他正则表达式中,因此您可以提取(或避免)数字.尽管有所有括号,但它不包含任何捕获组.因此,"matchOnlyNumberRe"仅匹配作为数字的字符串,并且具有整个字符串的捕获组.

以下是Jasmine测试,因此您可以看到它的作用和不处理:

describe("Number Regex", function() {
    var re = new RegExp("^("+ numberReSnippet + ")$");
    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);
    });
});
Run Code Online (Sandbox Code Playgroud)

  • `[E|e][+|-]?` 部分不正确。看起来您正在考虑 `(?:E|e)(?:\+|-)?` 并在将其放入字符集时忘记删除 `|`。当您使用分组来指定替代项时,您需要“|”,但在字符集中,列出的选项会自动相互替代,并且“|”没有特殊含义。所以像“[E|e]”这样的东西允许“E”、“e”和字符“|”。 (2认同)

use*_*656 13

^[0-9]$ 
Run Code Online (Sandbox Code Playgroud)

...是匹配任何单个数字的正则表达式,因此1将返回true但123将返回false.

如果你添加*量词,

^[0-9]*$
Run Code Online (Sandbox Code Playgroud)

表达式将匹配任意长度的数字字符串,123将返回true.(123f仍然会返回false).

请注意,从技术上讲,空字符串是一个0长度的数字字符串,因此它将使用^ [0-9]*$返回true如果您只想接受包含1位或更多位数的字符串,请使用+而不是*

^[0-9]+$
Run Code Online (Sandbox Code Playgroud)

正如其他许多人所指出的那样,实现这一点的方法不止一种,但我觉得指出原始问题中的代码只需要一个额外的字符就可以按预期工作是合适的.


Jua*_*nus 8

此功能检查它的输入是否是传统意义上的数字,因为人们期望正常数字检测功能起作用.

例如,这是一个可以用于HTML表单输入的测试.

它绕过了所有的JS民间传说,比如tipeof(NaN)= number,parseint('1 Kg')= 1,booleans强制数字等等.

它是通过将参数呈现为字符串并将该字符串与@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' ));
Run Code Online (Sandbox Code Playgroud)

正则表达式的解释:

/^-?(\d+\.?\d*)$|(\d*\.?\d+)$/  
Run Code Online (Sandbox Code Playgroud)

最初的"^"和最后的"$"匹配字符串的开头和结尾,以确保检查跨越整个字符串." - ?" 部分是带"?"的减号 允许零或一个实例的乘数.

然后有两个相似的组,用括号分隔.该字符串必须与这些组中的任何一个匹配.第一个匹配数字,如5.和第二个.5

第一组是

\d+\.?\d*
Run Code Online (Sandbox Code Playgroud)

"\ d +"匹配一个数字(\ d)一次或多次.
"\.?" 是小数点(用"\"进行转义以使其没有魔法),零或一次.

最后一部分"\ d*"再次是一个数字,零次或多次.
所有部分都是可选的,但是第一个数字,所以这个组匹配的数字像5.而不是.5,它们与另一半相匹配.


jjr*_*jrv 7

如果数字不应该大得离谱,可以使用:

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.
)
Run Code Online (Sandbox Code Playgroud)

这试图避免某些情况,以防万一:

  • 溢出原始字符串可能传递到的任何缓冲区。
  • 由非正规数(如1E-323.
  • 路过Infinity时,有限数量的预期(尝试1E309-1E309)。


小智 7

为什么不使用类似的东西:

$.isNumeric($(input).val())
Run Code Online (Sandbox Code Playgroud)

是否对jquery进行了测试,并检查了最常见的情况


Muh*_*eel 7

\ d将不匹配小数点。将以下内容用作小数。

const re = /^[0-9.]+$/
'123'.match(re)       // true
'123.3'.match(re)     // true
'123!3'.match(re)     // false
Run Code Online (Sandbox Code Playgroud)

  • 并非所有事情都应该留给正则表达式:) 有先决条件到先决条件,未知到未知。 (2认同)

LPO*_*Yui 6

也许它有效:

let a = "1234"
parseInt(a) == a // true
let b = "1234abc"
parseInt(b) == b // false
Run Code Online (Sandbox Code Playgroud)


Eri*_*sky 5

你需要*所以它说“前一个字符的零个或多个”,这应该这样做:

var reg = new RegExp('^\\d*$');
Run Code Online (Sandbox Code Playgroud)


And*_*rej 5

如果您只需要正整数且不需要前导零(例如"0001234"或"00"):

var reg = /^(?:[1-9]\d*|\d)$/;
Run Code Online (Sandbox Code Playgroud)


srb*_*ton 5

简单的正则表达式 JavaScript

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

*结果

1232432122
Run Code Online (Sandbox Code Playgroud)

仅检查数字:

if(rCnpj === cnpj){
   return true;
}
Run Code Online (Sandbox Code Playgroud)

简单的例子

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