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

Max*_*ams 6 javascript regex

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

红宝石:

name = "users[107][teacher_type]"

num = name.scan(/\d+/).first
Run Code Online (Sandbox Code Playgroud)

但在JavaScript中我必须这样做,这看起来有点笨重.

JavaScript的:

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

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

var num = regexp.exec(name)[0]
Run Code Online (Sandbox Code Playgroud)

有没有办法在不构建RegExp对象的情况下拉出匹配的部分?也就是Ruby的String#scan的单行代码?

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

在Ruby中:

num = name.gsub(/users\[|\]\[teacher_type\]/,"")
Run Code Online (Sandbox Code Playgroud)

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

在JavaScript中:

//works

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

//doesn't work

num = name.gsub(/users\[|\]\[teacher_type\]/,"")
Run Code Online (Sandbox Code Playgroud)

谁能让我直截了当?

fea*_*age 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]
Run Code Online (Sandbox Code Playgroud)

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

您指的另一个匹配(负匹配)需要一个特殊标志.要复制gsub的功能,您需要告诉正则表达式使用g标志多次应用.

'users[107][teacher_type]'.replace(/users\[|\]\[teacher_type\]/g,'')
Run Code Online (Sandbox Code Playgroud)

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

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

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