【问题标题】:How can I extract a number from a string in JavaScript?如何从 JavaScript 中的字符串中提取数字?
【发布时间】:2012-04-17 17:19:51
【问题描述】:

我在 JavaScript 中有一个字符串(例如 #box2),我只想要其中的 2

我试过了:

var thestring = $(this).attr('href');
var thenum = thestring.replace( /(^.+)(\w\d+\w)(.+$)/i,'$2');
alert(thenum);

它仍然在警报中返回#box2,我怎样才能让它工作?

它需要适应末尾附加的任何长度数字。

【问题讨论】:

  • 你可以这样做。它会运作良好。 var thestring = $(this).attr('href'); var thenum = parsefloat(thestring); alert(thenum);
  • 这段代码对我来说很好,但在一种情况下,我有一个字符串'2.5/mile',我想从中提取 2.5。上面的代码给了我 25 而不是 2.5

标签: javascript regex string numbers


【解决方案1】:

对于这个具体的例子,

 var thenum = thestring.replace( /^\D+/g, ''); // replace all leading non-digits with nothing

一般情况下:

 thenum = "foo3bar5".match(/\d+/)[0] // "3"

由于这个答案因某种原因而广受欢迎,这里有一个好处:正则表达式生成器。

function getre(str, num) {
  if(str === num) return 'nice try';
  var res = [/^\D+/g,/\D+$/g,/^\D+|\D+$/g,/\D+/g,/\D.*/g, /.*\D/g,/^\D+|\D.*$/g,/.*\D(?=\d)|\D+$/g];
  for(var i = 0; i < res.length; i++)
    if(str.replace(res[i], '') === num) 
      return 'num = str.replace(/' + res[i].source + '/g, "")';
  return 'no idea';
};
function update() {
  $ = function(x) { return document.getElementById(x) };
  var re = getre($('str').value, $('num').value);
  $('re').innerHTML = 'Numex speaks: <code>' + re + '</code>';
}
<p>Hi, I'm Numex, the Number Extractor Oracle.
<p>What is your string? <input id="str" value="42abc"></p>
<p>What number do you want to extract? <input id="num" value="42"></p>
<p><button onclick="update()">Insert Coin</button></p>
<p id="re"></p>

【讨论】:

  • -1, "#box2_col3".replace( /^\D+/g, '') 应该显示 2,而不是 2_col3
  • @shiplu.mokadd.im:我在问题中没有看到对#box2_col3 的任何引用。
  • 是的,没有#box2_col3 的引用。但是请参阅使用的正则表达式 OP (\w)(.+$)),它清楚地表明数字后面还有其他字符。
  • 在这种情况下,如果结尾之前有数字,您的模式也会失败。
  • 您可以使用 theString.replace(/^.*\D+/g, ''); 使 replace 与前导数字一起工作,但 shiplu.mokadd.im 的解决方案更好。
【解决方案2】:

您应该尝试以下方法:

var txt = "#div-name-1234-characteristic:561613213213";
var numb = txt.match(/\d/g);
numb = numb.join("");
alert (numb);​

结果

1234561613213213

【讨论】:

  • 不错的答案,但如果我想要单独的一组数字怎么办。即 1234、5616133...
  • 或单行+解析为整数:parseInt(txt.match(/\d/g).join(''), 10)
  • " $ 20.0 ".match(/\d/g).join('') => "200"(只是说)
【解决方案3】:

我认为这个正则表达式会达到你的目的:

var num = txt.replace(/[^0-9]/g,'');

txt 是你的字符串。

它基本上会撕掉任何不是数字的东西。

我认为你也可以通过使用它来达到同样的效果:

var num = txt.replace(/\D/g,'');

【讨论】:

【解决方案4】:

尝试以下操作:string.replace(/[^0-9]/g, ''); 这将删除所有非数字字符,只保留字符串中的数字

function retnum(str) { 
    var num = str.replace(/[^0-9]/g, ''); 
    return parseInt(num,10); 
}

console.log('abca12bc45qw'.replace(/[^0-9]/g, ''));
console.log('#box2'.replace(/[^0-9]/g, ''));

【讨论】:

  • 这比公认的答案要好,因为它确实替换了全局所有非数字,顺便说一句,/[^0-9]/g 可以替换为/[^\d]/g
【解决方案5】:

使用匹配功能。

var thenum = "0a1bbb2".match(/\d+$/)[0];
console.log(thenum);

【讨论】:

  • 你也可以添加一元 '+' 使其成为整数 var thenum = +thestring.match(/\d+$/)[0];
  • 我猜这不适用于 > 1 位数字? (我知道问题是针对 1 位数字,但我正在查看可能 > 10 的数字。)
  • @nissemand 不要猜测。自己试试。即使你没有看到小提琴。
  • 喜欢这个。无需触摸或修改元素即可将数字提取到变量中的最简单方法。对于字符串中的多个巧合,我将不胜感激。即字符串 12a55 报告最后一个数字,而不是全部。
  • @YevgeniyAfanasyev 它不应该。检查原始问题。特别是最后一行。数字应该在最后。
【解决方案6】:

这是一个通过货币和格式提取价格的 sn-p:

var price = "£1,739.12";
parseFloat(price.replace( /[^\d\.]*/g, '')); // 1739.12

【讨论】:

  • 如果我想要 1,739.12 怎么办?
【解决方案7】:

用这个代码尝试了上面引用的所有组合并让它工作,是唯一一个在那个字符串上工作的组合 -> (12) 3456-7890

var str="(12) 3456-7890";
str.replace( /\D+/g, '');

结果: "1234567890"

Obs:我知道这样的字符串不会出现在 attr 上,但无论如何,解决方案更好,因为它更完整。

【讨论】:

  • 我认为str.match(/\d+/g).map(Number) 会更好,它会返回一个数组
【解决方案8】:

你可以使用很棒的 parseInt 方法

它将前导数字转换为数字

parseInt("-10px");
// will give you -10

【讨论】:

  • 这仅在数字位于字符串开头时有效
  • 它返回 NaN
【解决方案9】:

您可以使用正则表达式从字符串中提取数字:

let string = "xxfdx25y93.34xxd73";
let res = string.replace(/\D/g, "");
console.log(res); 

输出:25933473

将其包装成原生 javascript 函数:

function onlyNumbers(text){
    return text.replace(/\D/g, "");
}

【讨论】:

    【解决方案10】:

    对于像#box2 这样的字符串,这应该可以工作:

    var thenum = thestring.replace(/^.*?(\d+).*/,'$1');
    

    jsFiddle:

    【讨论】:

      【解决方案11】:

      function justNumbers(string) 
      {
         var numsStr = string.replace(/[^0-9]/g,'');
         return parseInt(numsStr);
      }
          
      console.log(justNumbers('abcdefg12hijklmnop'));

      你可以做这样的功能

      function justNumbers(string) 
          {
              var numsStr = string.replace(/[^0-9]/g,'');
              return parseInt(numsStr);
          }
      

      记住:如果数字前面有一个零,则 int 不会有它

      【讨论】:

        【解决方案12】:

        你可以使用正则表达式。

        var txt="some text 2";
        var numb = txt.match(/\d/g);
        alert (numb);
        

        这会提醒 2。

        【讨论】:

        • -1 多位数字不会被捕获并在警报中使用数组
        【解决方案13】:

        如果您想解析价格为 6,694.20 美元的数字。
        可以这样做:

        parseFloat('$6,694.20'.replace( /^\D|,+/g, ''))
        

        或通过函数:

        function parsePrice(value) {
          return parseFloat(value.replace( /^\D|,+/g, ''))
        }
        parsePrice('$6,694.20') // 6694.2
        

        【讨论】:

          【解决方案14】:

          你可以使用下划线字符串库如下

          var common="#box"
          var href="#box1"
          
          _(href).strRight(common)
          

          结果将是:1

          见:https://github.com/epeli/underscore.string

          演示:
          http://jsfiddle.net/abdennour/Vyqtt/
          HTML 代码:

          <p>
              <a href="#box1" >img1</a>
              <a href="#box2" >img2</a>
              <a href="#box3" >img3</a>
              <a href="#box4" >img4</a>
          </p>
          <div style="font-size:30px"></div>
          

          JS代码:

          var comm="#box"
          $('a').click(function(){
            $('div').html(_($(this).attr('href')).strRight(comm))})
          

          如果你有如下后缀:

          href="box1az" 
          

          你可以使用下一个演示:

          http://jsfiddle.net/abdennour/Vyqtt/1/

          function retrieveNumber(all,prefix,suffix){
           var left=_(all).strRight(prefix);
           return _(left).strLeft(suffix);
          
          }
          

          【讨论】:

            【解决方案15】:

            使用正则表达式,如何从String中获取数字,例如:

            String myString = "my 2 first gifts were made by my 4 brothers";
            myString = myString .replaceAll("\\D+","");
            System.out.println("myString : " + myString);
            

            myString 的结果是“24

            您可以在此处查看此运行代码的示例: http://ideone.com/iOCf5G

            【讨论】:

            • java !== javascript - replaceAll 在标准 javascript 中不存在。只有一些像 jQuery 这样的库有这个方法。以后,你应该澄清一下。
            【解决方案16】:

            这是一个解决方案。不检查任何数据

            var someStr = 'abc'; // add 123 to string to see inverse
            
            var thenum = someStr.match(/\d+/);
            
            if (thenum != null )
            {
                console.log(thenum[0]);
            }
            else
            {
             console.log('no number');
            }
            

            【讨论】:

              【解决方案17】:

              如果有人需要在提取的数字中保留点:

              var some = '65,87 EUR';
              var number = some.replace(",",".").replace(/[^0-9&.]/g,'');
              console.log(number); // returns 65.87
              

              【讨论】:

                【解决方案18】:

                使用此单行代码获取字符串中的第一个数字而不会出错:

                var myInt = parseInt(myString.replace(/^[^0-9]+/, ''), 10);
                

                【讨论】:

                  【解决方案19】:

                  请检查下面的javaScripts,那里你只能得到数字

                  var txt = "abc1234char5678#!9";
                  var str = txt.match(/\d+/g, "")+'';
                  var s = str.split(',').join('');
                  alert(Number(s));

                  输出:1234567789

                  【讨论】:

                    【解决方案20】:
                    var elValue     = "-12,erer3  4,-990.234sdsd";
                    
                    var isNegetive = false;
                    if(elValue.indexOf("-")==0) isNegetive=true;
                    
                    elValue     = elValue.replace( /[^\d\.]*/g, '');
                    elValue     = isNaN(Number(elValue)) ? 0 : Number(elValue);
                    
                    if(isNegetive) elValue = 0 - elValue;
                    
                    alert(elValue); //-1234990.234
                    

                    【讨论】:

                    • 广告解释。例如。为什么你使用这个正则表达式。
                    【解决方案21】:

                    这个答案将涵盖大部分情况。当用户尝试复制粘贴电话号码时,我可以解决这种情况

                      $('#help_number').keyup(function(){
                        $(this).val().match(/\d+/g).join("")
                      });
                    

                    说明:

                    str= "34%^gd 5-67 6-6ds"
                    
                    str.match(/\d+/g)
                    

                    它将给出一个字符串数组 输出 >> ["34", "56766"]

                    str.match(/\d+/g).join("")
                    

                    join 会将数组数据转换并连接成单个字符串

                    输出>>“3456766”

                    在我的示例中,我需要输出为 209-356-6788,因此我使用了替换

                      $('#help_number').keyup(function(){
                        $(this).val($(this).val().match(/\d+/g).join("").replace(/(\d{3})\-?(\d{3})\-?(\d{4})/,'$1-$2-$3'))
                      });
                    

                    【讨论】:

                      【解决方案22】:

                      您需要添加“(/\d+/g)”,它将删除所有非数字文本,但此时它仍然是一个字符串。如果通过匹配创建变量和“parseInt”,则可以将新变量设置为数组值。这是我如何让它工作的一个例子:

                          var color = $( this ).css( "background-color" );
                          var r = parseInt(color.match(/\d+/g)[0]);
                          var g = parseInt(color.match(/\d+/g)[1]);
                          var b = parseInt(color.match(/\d+/g)[2]);
                      

                      【讨论】:

                      • 您好!这个问题已经有一个公认的答案。在查看已回答的问题之前,请考虑先查看unanswered ones。但是,如果您确实对已回答的问题有补充意见,请考虑先彻底阅读其他答案。
                      【解决方案23】:

                      要从字符串中返回一个 int,您可以执行以下代码。它删除所有非数字字符并返回整数。

                      Number("strin[g]3".replace(/\D+/g, ""))
                      

                      【讨论】:

                        【解决方案24】:
                        changeStrangeDate(dateString: string) {
                        var sum = 0;
                        var numbers = dateString.match(/\d+/g);
                        if (numbers.length > 1) {
                          numbers.forEach(element => {
                            sum += parseInt(element);
                          }
                          );
                        }
                        console.log(new Date(sum).toDateString());
                        return new Date(sum).toUTCString();
                        

                        }

                        你可以这样做,然后在你需要的地方调用函数,带参数。

                        this.changeStrangeDate('/Date(1551401820000-0100)/');
                        

                        【讨论】:

                          【解决方案25】:

                          在我的一个项目中,我必须从字符串中获取评分值,这就是我使用的:

                           let text = '#xbox2'
                            let num = text.trim().
                            split('').
                            map(num => Number(num)).
                            filter(x => Number.isInteger(x)
                          

                          )

                          【讨论】:

                            【解决方案26】:

                            不用正则表达式编写

                            // Without Regex 
                            
                            function extractNumber(string) {
                              let numArray = string.split('').map(item => {
                                if (typeof +item === 'number' && !isNaN(+item)) return +item
                              })
                              return +numArray.join('')
                            }
                            
                            extractNumber('@1200milion$')  // 1200

                            【讨论】:

                              猜你喜欢
                              • 2011-10-25
                              • 2017-07-20
                              • 2012-01-12
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多