【问题标题】:Regex using javascript to return just numbers使用 javascript 的正则表达式只返回数字
【发布时间】:2023-04-02 01:44:01
【问题描述】:

如果我有一个像“something12”或“something102”这样的字符串,我将如何在 javascript 中使用正则表达式来仅返回数字部分?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    正则表达式:

    var numberPattern = /\d+/g;
    
    'something102asdfkj1948948'.match( numberPattern )
    

    这将返回一个包含两个元素的数组,“102”和“1948948”。随心所欲地操作。如果不匹配,则返回 null。

    连接它们:

    'something102asdfkj1948948'.match( numberPattern ).join('')
    

    假设您不处理复杂的小数,我想这应该足够了。

    【讨论】:

    • 错误。讨厌挑剔,但这会返回一个数组,而不是一个对象(至少在 chrome 中)。
    • 所有数组都是对象,不是吗?
    • @MuhammadUmer - 你试过了吗?
    • @Onza 您在d 之前缺少反斜杠,所以.match(/\d+/g)
    • @MuhammadUmer, @meder:你们两个应该联合起来:parseInt('987d98sf79s7f9s8f9sf'.match(/\d+/gi).join(''))
    【解决方案2】:

    我猜你想从字符串中获取数字。在这种情况下,您可以使用以下内容:

    // Returns an array of numbers located in the string
    function get_numbers(input) {
        return input.match(/[0-9]+/g);
    }
    
    var first_test = get_numbers('something102');
    var second_test = get_numbers('something102or12');
    var third_test = get_numbers('no numbers here!');
    
    alert(first_test); // [102]
    alert(second_test); // [102,12]
    alert(third_test); // null
    

    【讨论】:

    • 为了清楚起见,get_numbers/1 返回一个字符串数组,而不是数字。对于您的示例,它将返回: * ["102"] * ["102", "12"] * null
    【解决方案3】:

    您还可以去除所有非数字字符(\D[^0-9]):

    let word_With_Numbers = 'abc123c def4567hij89'
    let word_Without_Numbers = word_With_Numbers.replace(/\D/g, '');
    
    console.log(word_Without_Numbers)

    【讨论】:

    • 好吧,除了 OP 想要“只是数字部分”,而不是字符串。
    • @ScottFraley 请注意,此代码使用replace 方法,而不是match 方法;)
    【解决方案4】:

    给出的答案实际上与您的问题不匹配,这暗示了一个尾随数字。另外,请记住你得到了一个字符串;如果您确实需要一个数字,请转换结果:

    item=item.replace('^.*\D(\d*)$', '$1');
    if (!/^\d+$/.test(item)) throw 'parse error: number not found';
    item=Number(item);
    

    如果您正在处理网页上的数字项目 ID,您的代码还可以有效地接受 Element,从其 id(或其第一个具有 id 的父项)中提取数字;如果你有一个方便的Event,你也可以从中获得Element

    【讨论】:

    • 虽然这是一个很好的答案,但我不认为其他答案“实际上与 [the] question 不匹配”。事实上,其他答案更加通用。他们将使用尾随数字以及中间的数字。假设 OP 希望它只使用尾随数字有点冒昧。
    【解决方案5】:
    var result = input.match(/\d+/g).join([])
    

    【讨论】:

      【解决方案6】:

      如果你只想要数字:

      var value = '675-805-714';
      var numberPattern = /\d+/g;
      value = value.match( numberPattern ).join([]);
      alert(value);
      //Show: 675805714
      

      现在你得到了加入的数字

      【讨论】:

        【解决方案7】:

        对于带小数和减号的数字,我使用这个 sn-p:

        const NUMERIC_REGEXP = /[-]{0,1}[\d]*[.]{0,1}[\d]+/g;
        
        const numbers = '2.2px 3.1px 4px -7.6px obj.key'.match(NUMERIC_REGEXP)
        
        console.log(numbers); // ["2.2", "3.1", "4", "-7.6"]

        更新:- 2018 年 7 月 9 日

        找到了一个可以让您直观地编辑正则表达式的工具:JavaScript Regular Expression Parser & Visualizer

        更新:

        这是另一个您甚至可以调试正则表达式的工具:Online regex tester and debugger

        更新:

        另一个:RegExr

        更新:

        RegexperRegex Pal

        【讨论】:

        • 完美,唯一适用于小数和负数的解决方案
        【解决方案8】:

        如果您想捕获任何类型的数字,IMO 的 #3 answer at this time 是陈大超的正确方法,但正则表达式可以缩短为:

        /[-]{0,1}[\d]*[\.]{0,1}[\d]+/g
        

        到:

        /-?\d*\.?\d+/g
        

        例如这段代码:

        "lin-grad.ient(217deg,rgba(255, 0, 0, -0.8), rgba(-255,0,0,0) 70.71%)".match(/-?\d*\.?\d+/g)
        

        生成这个数组:

        ["217","255","0","0","-0.8","-255","0","0","0","70.71"]
        

        我已经编写了一个 MDN 线性渐变示例,以便它完全测试正则表达式并且不需要在此处滚动。我想我已经包含了负数、小数、单位后缀(如 deg 和 %)、不一致的逗号和空格使用以及文本“lin-grad.ient”中额外的点/句点和连字符/短划线字符方面的所有可能性”。如果我遗漏了什么,请告诉我。我唯一能看到它无法处理的是格式错误的十进制数,例如“0..8”。

        如果你真的想要一个数字数组,你可以在同一行代码中转换整个数组:

        array = whatever.match(/-?\d*\.?\d+/g).map(Number);
        

        我的特定代码是解析 CSS 函数,不需要担心点/句点字符的非数字使用,所以正则表达式可以更简单:

        /-?[\d\.]+/g
        

        【讨论】:

          【解决方案9】:

          如果您还想要点/逗号分隔的数字,那么:

          \d*\.?\d*
          

          [0-9]*\.?[0-9]*
          

          您可以使用https://regex101.com/ 来测试您的正则表达式。

          【讨论】:

            【解决方案10】:

            其他解决方案所具备的一切,但需要一点验证

            // value = '675-805-714'
            const validateNumberInput = (value) => { 
                let numberPattern = /\d+/g 
                let numbers = value.match(numberPattern)
            
                if (numbers === null) {
                    return 0
                }  
            
                return parseInt(numbers.join([]))
            }
            // 675805714
            

            【讨论】:

              【解决方案11】:

              使用拆分和正则表达式:

                  var str = "fooBar0123".split(/(\d+)/);
                  console.log(str[0]); // fooBar
                  console.log(str[1]); // 0123
              

              【讨论】:

                【解决方案12】:

                根据@Syntle 的回答,如果您只有非数字字符,您将获得Uncaught TypeError: Cannot read property 'join' of null

                如果没有找到匹配项,这将防止错误并返回一个空字符串:

                ('something'.match( /\d+/g )||[]).join('')

                【讨论】:

                  【解决方案13】:

                  以下是使用 Regex 将字符串转换为有效的纯数字或十进制数字的解决方案:

                  //something123.777.321something to 123.777321
                  const str = 'something123.777.321something';
                  let initialValue = str.replace(/[^0-9.]+/, '');
                  //initialValue = '123.777.321';
                  
                  //characterCount just count the characters in a given string
                  if (characterCount(intitialValue, '.') > 1) {
                   const splitedValue = intitialValue.split('.');
                   //splittedValue = ['123','777','321'];
                   intitialValue = splitedValue.shift() + '.' + splitedValue.join('');
                   //result i.e. initialValue = '123.777321'
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 2014-06-01
                    • 1970-01-01
                    • 2012-11-23
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-08-02
                    • 2023-02-16
                    • 2020-02-02
                    • 1970-01-01
                    相关资源
                    最近更新 更多