我想在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\]/,"")
有人能帮我直接吗?
答案 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