我正在尝试在单个正则表达式中实现以下两个规则:
如果数字前面是:
- 单词字符或@字符;然后不匹配任何内容
- 其他任何事情;然后在结果中匹配数字但不包含前面的字符
我尝试过:[^@\d,\w]\d+
和 (?:[^@\d,\w])\d+
它解决了第一个规则,但无法解决第二个规则,因为它在结果中包含运算符。
我明白为什么它没有按预期工作; [^@\d\w]
部分明确表示不匹配以 @ 或单词字符开头的数字,因此它隐式表示在结果中包含其他任何内容。问题是我仍然不知道如何解决这个问题。
有没有办法在一个正则表达式中实现这两个规则?
输入字符串:
@121 //do not match
+39 //match but don't include the + sign in result
s21 //do not match
89 //match
(98 //match but don't include the ( in result
/4 //match but don't include the / operator in result
预期结果:
39 //operator removed
89
98 //( removed
4 //operator removed
最佳答案
按照下面的代码片段所示捕获您正在寻找的结果。
^[^@\w]?(\d+)
^
断言位置位于行首[^@\w]?
可选择匹配除@
或单词字符之外的任何字符(\d+)
将一个或多个数字捕获到捕获组 1
var a = ["@121", "+39", "s21", "89", "(98", "/4"]
var r = /^[^@\w]?(\d+)/
a.forEach(function(s){
var m = s.match(r)
if(m != null) console.log(m[1])
})
关于javascript 正则表达式在匹配之前检查字符但不将其包含在结果中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49261573/