【问题标题】:Get the first integers in a string with JavaScript使用 JavaScript 获取字符串中的第一个整数
【发布时间】:2009-03-04 07:31:26
【问题描述】:

我在一个循环中有一个字符串,对于每个循环,它都充满了如下所示的文本:

"123 hello everybody 4"
"4567 stuff is fun 67"
"12368 more stuff"

我只想检索到字符串中文本的第一个数字,当然我不知道长度。

提前致谢!

【问题讨论】:

  • 如果你知道字符串中有一个数字,你可以使用这个单行:"Hello 123 there! 45".match(/\d+/).shift(); 否则,你需要在做之前测试null .shift()Source

标签: javascript string string-formatting


【解决方案1】:

如果数字在字符串的开头:

("123 hello everybody 4").replace(/(^\d+)(.+$)/i,'$1'); //=> '123'

如果它在字符串中的某处:

(" hello 123 everybody 4").replace( /(^.+)(\w\d+\w)(.+$)/i,'$2'); //=> '123'

对于字符之间的数字:

("hello123everybody 4").replace( /(^.+\D)(\d+)(\D.+$)/i,'$2'); //=> '123'

[附录]

匹配字符串中所有数字的正则表达式:

"4567 stuff is fun4you 67".match(/^\d+|\d+\b|\d+(?=\w)/g); //=> ["4567", "4", "67"]

您可以将结果数组映射到数字数组:

"4567 stuff is fun4you 67"
  .match(/^\d+|\d+\b|\d+(?=\w)/g)
  .map(function (v) {return +v;}); //=> [4567, 4, 67]

包括花车:

"4567 stuff is fun4you 2.12 67"
  .match(/\d+\.\d+|\d+\b|\d+(?=\w)/g)
  .map(function (v) {return +v;}); //=> [4567, 4, 2.12, 67]

如果存在字符串不包含任何数字的可能性,请使用:

( "stuff is fun"
   .match(/\d+\.\d+|\d+\b|\d+(?=\w)/g) || [] )
   .map(function (v) {return +v;}); //=> []

所以,要检索字符串4567 stuff is fun4you 2.12 67"的开始或结束数字

// start number
var startingNumber = ( "4567 stuff is fun4you 2.12 67"
  .match(/\d+\.\d+|\d+\b|\d+(?=\w)/g) || [] )
  .map(function (v) {return +v;}).shift(); //=> 4567

// end number
var endingNumber = ( "4567 stuff is fun4you 2.12 67"
  .match(/\d+\.\d+|\d+\b|\d+(?=\w)/g) || [] )
  .map(function (v) {return +v;}).pop(); //=> 67

【讨论】:

  • 这些不太好用。 ("hello123").replace( /(^.+\D)(\d+)(\D.+$)/i,'$2') 返回 "hello124"。事实上,如果数字在字符串的末尾,这些都不起作用。
  • @user1311069:嗯,答案中没有包含这种情况。如果您提供解决方案,那将是建设性的。随意;)
  • @user1311069:提供了一些额外的方法,也满足你的需要。
  • 这些太复杂了。 "Hello 123 there! 45".match(/\d+/).shift(); 适用于大多数需求。如果您不确定字符串中是否有数字,请在 .shift() 之前测试 null
【解决方案2】:
var str = "some text and 856 numbers 2";
var match = str.match(/\d+/);
document.writeln(parseInt(match[0], 10));

如果字符串以数字开头(可能前面有空格),简单的parseInt(str, 10) 就足够了。 parseInt 将跳过前导空格。

10 是必需的,否则像 08 这样的字符串将被转换为 0(在大多数实现中,parseInt 认为以 0 开头的数字为八进制)。

【讨论】:

  • 给定正则表达式/\d+/,你并不需要parseInt,类似+match.shift()Number(match.shift()) 就足够了。此外,您需要检查是否确实存在匹配项。输入字符串可能根本不包含数字:在这种情况下,match 将是 null
【解决方案3】:

如果你想要一个 int,只需 parseInt(myString, 10)。 (10 表示基数为 10;否则,JavaScript 可能会尝试使用不同的基数,例如 8 或 16。)

【讨论】:

    【解决方案4】:

    这个replace方法带有一个简单的正则表达式 ([^\d].*):

    '123 your 1st string'.replace( /[^\d].*/, '' );
    // output: "123"
    

    删除没有第一位数字的所有内容

    【讨论】:

      【解决方案5】:

      使用正则表达式:

      var re = new RegExp(/^\d+/); //starts with digit, one or more
      var m = re.exec("4567 stuff is fun 67");
      alert(m[0]); //4567
      
      m = re.exec("stuff is fun 67");
      alert(m); // null
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-15
        • 1970-01-01
        • 1970-01-01
        • 2010-12-28
        • 2015-02-08
        • 1970-01-01
        相关资源
        最近更新 更多