【问题标题】:Regex to check whether a string contains only numbers [duplicate]正则表达式检查字符串是否仅包含数字[重复]
【发布时间】:2012-02-19 03:46:20
【问题描述】:
hash = window.location.hash.substr(1);
var reg = new RegExp('^[0-9]$');
console.log(reg.test(hash));

我在"123""123f" 上都错了。我想检查哈希是否只包含数字。我错过了什么吗?

【问题讨论】:

  • 根据 W3schools ^ 仅在 inside 括号内否定序列,因此 [^0-9] 指的是非数字,但 ^[0-9] 确实表示“行首”

标签: javascript regex


【解决方案1】:

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

const reg = new RegExp('^[0-9]+$');

const reg = new RegExp('^\d+$')

\d[0-9] 都是同一个意思。 使用的 + 表示搜索出现的一个或多个 [0-9]。

【讨论】:

  • 这不完全正确,[0-9] 和\d 不一样,\d 还匹配来自其他字符集的数字字符,例如希伯来语和中文。
【解决方案2】:
var reg = /^\d+$/;

应该这样做。原始匹配任何只包含一个数字的内容。

【讨论】:

  • @vsync,因为\d 在单引号字符串中是字母“d”。尝试在 JavaScript 控制台中运行 '/^\d+$/' === '/^d+$/'。在字符串中嵌入 RegExp 时需要双重转义:eval('/^\\d+$/')
  • 不考虑负数。
  • @GiuseppePes。真的。它也不处理实数、复数、四元数等。与数数有关的问题和我的答案也是如此。
  • /^[\+\-]?\d*\.?\d+(?:[Ee][\+\-]?\d+)?$/
  • @D_N。很公平。就您最初的观点而言,是的 008 在许多 PL 中是一个错误标记,因为它以八进制文字开头,但在标准数学符号中,隐含了 ₁₀。我不知道提问者想要哪个,如果我要拒绝格式错误的八进制,我应该匹配有效的十六进制并决定是否包含 Python3/Java 数字,如 123_456 或 C++ 123'456\d+ 似乎是在没有更多上下文(如特定编程或人类语言)的情况下的中间立场,并且在作者的第一次尝试中强烈建议。
【解决方案3】:

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

var reg = new RegExp('^\\d*$');

【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

    • 你的第二个正则表达式真的很有帮助。它只是在验证像 .378 这样的数字时卡住了,请您告诉我如何调整 /^-?\d+\.?\d*$/ 以便它也验证 .378
    • + 更改为 *: ^-?\d*\.?\d*$+ 表示您在前面寻找至少一个数字,* 在寻找零个或多个数字。
    • 为了更好地使用浮动 /^-?\d+(\.\d+)?$/
    • 如果您不想允许为空但想允许像 .25 这样的语法,请使用 var reg = /^-?\d*[\.]?\d+$/
    • 如果要测试字符串是否为可解析数字,包括负数和小数:/^-?\d+\.?\d*$|^\d*\.?\d+$/
    【解决方案5】:

    仅数字正则表达式(更新

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

    【讨论】:

    • 应该把'/'删除为 new RegExp('[^0-9]','g');
    • 这个正则表达式是错误的,因为它匹配所有内容,但不匹配数字...如果它必须按照您的意图进行,您应该从方括号中删除^...并且语法错误为@vagabond 提到了它。
    【解决方案6】:
    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"));
    

    【讨论】:

    • 非常有用的实用程序
    【解决方案7】:

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

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

    【讨论】:

    • 这不会匹配.123 或任何负数。请改用/^-?\d*\.?\d+$/
    • 已编辑,现在可以了。
    【解决方案8】:

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

    例如,这是一种可用于 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) 一次或多次。
    这 ”\。?”是小数点(用“\”转义以消除它的魔力),零次或一次。

    最后一部分“\d*”又是一个数字,零次或多次。
    除第一个数字外,所有部分都是可选的,因此该组匹配 5 之类的数字,而不是另一半匹配的 .5。

    【讨论】:

    • 4.5.3 适用于您的正则表达式
    • /^[\+\-]?\d*\.?\d+(?:[Ee][\+\-]?\d+)?$/
    • @RicheveBebedor 不错,您的版本宣传了指数的东西,这对于那些需要它的情况来说很好,比如在工程或天文输入中。我故意省略了它,寻找一个能返回最小有效资金输入值集的正则表达式。
    【解决方案9】:

    如果要将数字与带符号的值匹配,可以使用:

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

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

    【讨论】:

      【解决方案10】:

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

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

      【讨论】:

        【解决方案11】:

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

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

        【讨论】:

        • IsNumber 只会检查它是否是整数,因为它的名称应该检查它是否是一般的数字(双精度,整数)。我认为这个答案比其他答案更全面。
        • [E|e][+|-]? 部分不正确。看起来您在考虑 (?:E|e)(?:\+|-)? 并在将 | 放入字符集时忘记删除它。当您使用分组来指定替代时,您需要|,但在字符集中,列出的选择会自动相互替代,| 没有特殊含义。所以像[E|e] 这样的东西允许Ee 和字符|
        • 所以正确的正则表达式(没有非捕获组和双斜杠)是:/NaN|-?((\d*\.\d+|\d+)([Ee][+-]?\d+)?|Infinity)/。我调高了浮点数和整数,所以表达式变得更加贪婪。
        • 谢谢;我已将正则表达式更改为 @SimonZyx,并添加了一个单元测试以确认原始版本有问题。
        【解决方案12】:
        ^[0-9]$ 
        

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

        如果你加上 * 量词,

        ^[0-9]*$
        

        该表达式将匹配任意长度的数字字符串,并且 123 将返回 true。 (123f 仍将返回 false)。

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

        ^[0-9]+$
        

        正如许多其他人指出的那样,实现这一目标的方法不止几种,但我觉得指出原始问题中的代码只需要一个附加字符即可按预期工作是恰当的。

        【讨论】:

          【解决方案13】:

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

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

          【讨论】:

            【解决方案14】:
            /^[\+\-]?\d*\.?\d+(?:[Ee][\+\-]?\d+)?$/
            

            【讨论】:

              【解决方案15】:

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

              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 等非正规数引起的缓慢或奇怪。
              • 在需要有限数时传递Infinity(尝试1E309-1E309)。

              【讨论】:

                【解决方案16】:
                var pattern = /[0-9!"£$%^&*()_+-=]/;
                

                这会尽量避免一些情况,以防万一:

                溢出原始字符串可能传递到的任何缓冲区。 由像1E-323 这样的非正规数字引起的缓慢或奇怪。 在需要有限数时传递 Infinity(尝试 1E309-1E309)。

                【讨论】:

                • 您的模式如何实现这些既定目标?
                【解决方案17】:

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

                $.isNumeric($(input).val())
                

                jquery是否测试过,最常见的情况都检查过

                【讨论】:

                • 你问为什么不直接使用 jQuery。以下是为什么不这样做的原因。 1. 如果您的代码还没有使用 jQuery,添加 jQuery 只是为了检查值是否为数字?我不这么认为。 2. 假设您已经有一个框架,通过运行正则表达式列表来进行标记。如果你不使用数字的正则表达式,你必须为它编写一个特殊情况:遍历正则表达式列表,然后用 jQuery 检查标记是否为数字。使代码复杂化。 3. 如果需要允许NaN 或无穷大,$.isNumeric 将不起作用。
                • 现在是 2018 年。如果没有明确要求,任何建议 jQuery 作为解决方案的响应都应该被忽略。
                【解决方案18】:

                简单的正则表达式 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.");
                }
                

                【讨论】:

                • 此答案不检查字符串是否仅包含数字。相反,它会删除除数字以外的所有字符。您可以通过检查结果值是否严格等同于原始值来使您的答案适用于该问题:original_value === resulting_value // Only Numbers
                • 谢谢!它已被更改。
                【解决方案19】:

                您也可以使用以下方法,但请注意它们的内部实现和/或返回值。

                1A isNaN(+'13761123123123'); // returns true
                1B isNaN(+'13761123123ABC'); // returns false
                
                2A ~~'1.23'; // returns 1
                2B ~~'1.2A'; // returns 0
                

                对于 1A 和 1B,字符串首先使用 + 运算符进行强制类型转换,然后再传递给 isNaN() 函数。这是因为包含非数字值的数字类型返回NaNisNaN()'s 实现细节有一些注意事项,记录在 here 中。一种考虑是,如果一个布尔值被传递为isNaN(+false|true) 被强制转换为它们的数字等价物,因此false 被返回,但人们可能期望函数返回true,因为布尔值在什么意义上不是数字我们正在测试。

                对于 2A 和 2B,值得注意的是,要找到数字的补码,需要给定的值在有符号 32 位整数的值范围内,可以在 spec 中引用。

                我个人的偏好是 1A 和 1B,因为它们包含一元运算符,因此可读性较差。

                性能https://jsperf.com/numeric-string-test-regexvsisnan/1

                【讨论】:

                  【解决方案20】:

                  也许可行:

                  let a = "1234"
                  parseInt(a) == a // true
                  let b = "1234abc"
                  parseInt(b) == b // false
                  

                  【讨论】:

                  • 如果您有前导零,则失败,例如邮政编码。 parseInt('01234') != 01234.
                  • @PeterHollingsworth 谢谢!我不知道。
                  【解决方案21】:

                  \d 将不匹配小数点。使用以下小数。

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

                  【讨论】:

                  • 虽然说得很好,但这个正则表达式也会匹配一个只包含点的字符串(例如 '.....'.match(re) //true"
                  • 不是所有的东西都应该留给正则表达式:) 有先决条件,先决条件,未知数。
                  • 说得好,先生 :) 作为后续,我们可以使用/^\d*(\.\d+)?$/ 更好地匹配正浮点数
                  猜你喜欢
                  • 2017-05-03
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-12-28
                  • 2017-02-09
                  • 2014-03-30
                  • 1970-01-01
                  相关资源
                  最近更新 更多