如何在JavaScript中从字符串中提取数字?

时间:2009-07-15 08:20:07

标签: javascript regex

我想在JavaScript中的字符串中间拉出一个数字。在Ruby(我的主要语言)中我会这样做:

红宝石:

name = "users[107][teacher_type]"

num = name.scan(/\d+/).first

但是在JavaScript中我必须这样做,这看起来有点笨拙。

JavaScript的:

var name = "users[107][teacher_type]"

var regexp = new RegExp(/\d+/)

var num = regexp.exec(name)[0]

有没有办法在不构建RegExp对象的情况下拉出匹配的部分?即一个单行的Ruby的String#scan?

另外,作为旁注,由于此字符串将始终具有相同的格式,因此我可以使用.replace进行此操作。这不是一个聪明的解决方案,但我再次遇到JavaScript问题。

在Ruby中:

num = name.gsub(/users\[|\]\[teacher_type\]/,"")

但是当我在JavaScript中尝试这个时,它不喜欢正则表达式中间的or(|):

在JavaScript中:

//works

num = name.replace(/users\[/, "").replace(/\]\[teacher_type\]/,"")

//doesn't work

num = name.gsub(/users\[|\]\[teacher_type\]/,"")

有人能帮我直接吗?

6 个答案:

答案 0 :(得分:7)

创建动态正则表达式时,您只需要使用new RegExp()部分。您可以在其他时间使用文字。 / \ d + /相当于new RegExp("\\d+")。请注意,使用后者时必须转义特殊字符。

另外值得注意的是String#match返回null或数组。基于提供的解决方案(parseInt(name.match(/\d+/), 10)),这一点并不明显。恰好在传递给parseInt时将其转换为字符串。 ParseInt将字符串值转换为整数(如果可能)。

name.match(/\d+/)[0]
/\d+/.exec(name)[0]

在这种情况下,这两者在功能上是相同的。

您指的其他匹配(否定匹配)需要特殊标记。要复制gsub的功能,您需要使用g标志多次应用正则表达式。

'users[107][teacher_type]'.replace(/users\[|\]\[teacher_type\]/g,'')

或者,如果由于某种原因你必须使用new RegExp,你就会像上面那样完成同样的事情:

'users [107] [teacher_type]'。replace(new RegExp('users \ [| \] \ [teacher_type \]','g'),'')

再次注意我是如何逃避所有反斜杠的。 Mozilla的开发人员中心是一个很好的reference,可以在javascript中熟悉正则表达式。

答案 1 :(得分:3)

var num = name.replace(/\D+/, '');

请注意,这个单线程不会验证名称格式。它只删除了所有非数字(\D\d相反)。

答案 2 :(得分:2)

您还可以使用parseInt(string, radix)

为数字指定基数
var num = parseInt(name.match(/\d+/), 10);

答案 3 :(得分:1)

它在JavaScript中与在Ruby中一样简单(甚至更简单):

var num = name.match(/\d+/);

答案 4 :(得分:1)

除非您正在构建模式(通常通过字符串连接),否则不需要使用RegExp“构造函数”。模式文字是有效的(事实上,当你在RegExp()实际上更喜欢字符串时,你在你的代码片中发布了一个)

/\d+/.exec( name )[0]

完全有效。

关于你问题的第二部分,我认为你只是有一个错字。代替replace,您仍然拥有gsub这是Ruby方法,而不是JavaScript方法。模式本身应该可以正常工作。

答案 5 :(得分:0)

我个人认为这是最好的。

function parseNumber (n) {
  return Number(n.replace(/[^0-9\.-]+/g,""))
}

// Examples
parseNumber('4')        // 4
parseNumber('4.00')     // 4
parseNumber('$4.1s2')   // 4.12
parseNumber('')         // 0
parseNumber(' ')        // 0
parseNumber('$4.1s2.0') // NaN

我也处理输入值,所以我做了这样的函数:

function parseNum(n) {
  // strip all whitespace before and after
  n = String(n).trim()
  // if number is '' or ' ' return empty string
  if (!n) return ''
  // remove everything except numbers and '.'
  return n.replace(/[^0-9\.]+/g,"")
}

// Examples
parseNum('ss10ss')    // 10
parseNum('ss1ss0ss')  // 10
parseNum('2.00')      // 2.00
parseNum('$2.12')     // 2.12
parseNum('$2.s0s0ss') // 2.00
parseNum('')          // ""
parseNum(' ')         // ""
parseNum(4)           // 4