在Javascript中从字符串中提取所有数字

3
我想从给定的字符串中提取出所有合适的自然数。
var a = "@1234abc 12 34 5 67 sta5ck over @ numbrs ."
numbers = a.match(/d+/gi)

在上述字符串中,我只需要匹配数字12、34、5和67,而不是从第一个单词5中匹配到1234等所有数字。

因此,数字应为[12,34,5,67]。


1
为什么应该这样做呢?\d+匹配一个或多个数字,而1234是一个或多个。 - elclanrs
2
你在正则表达式周围使用了错误类型的斜杠;应该是/\d+/gi - Pointy
我知道这不是正确的正则表达式,我尝试了很多方法,但想不出正确的表达式。 - syllogismos
2个回答

7

使用单词边界。

> var a = "@1234abc 12 34 5 67 sta5ck over @ numbrs ."
undefined
> numbers = a.match(/\b\d+\b/g)
[ '12', '34', '5', '67' ]

解释:

  • \b 单词边界,匹配单词字符 (\w) 和非单词字符 (\W) 之间的位置。
  • \d+ 匹配一个或多个数字。
  • \b 单词边界,匹配单词字符和非单词字符之间的位置。

或者

> var myString = '@1234abc 12 34 5 67 sta5ck over @ numbrs .';
undefined
> var myRegEx = /(?:^| )(\d+)(?= |$)/g;
undefined
> function getMatches(string, regex, index) {
...     index || (index = 1); // default to the first capturing group
...     var matches = [];
...     var match;
...     while (match = regex.exec(string)) {
.....         matches.push(match[index]);
.....     }
...     return matches;
... }
undefined
> var matches = getMatches(myString, myRegEx, 1);
undefined
> matches
[ '12', '34', '5', '67' ]

这里借用了这里的代码。


1
第一个\b是必要的吗? - j08691
2
@syllogismos 不是的,它是一个零宽匹配,匹配单词和非单词字符(以任意顺序),请参见http://www.regular-expressions.info/wordboundaries.html。@j08691 - 只要你不想从something123中匹配出123,就需要它。 - Aprillion
1
我认为这里没有必要进行不区分大小写的匹配。 - Tom Fenech
1
@yitwail 在任何情况下它都无法在 "@1234" 中起作用,因为它会从该字符串匹配 1234 ,而不管第一个 \b ,因为 @1 之间存在单词边界。但是 JavaScript 不支持后顾,因此需要进行恶意黑客攻击才能排除该情况。 - Aprillion
@Aprillion \w 代表“单词字符”。它始终匹配 ASCII 字符 [A-Za-z0-9_]。来源 http://www.regular-expressions.info/shorthand.html - Avinash Raj
显示剩余10条评论

2

如果有人对匹配由空格字符包围的数字感兴趣,并且使用支持lookbehind(像Perl和Python,但当前版本的JavaScript不支持),那么这个问题很简单:

(?<=^|\s)\d+(?=\s|$)

正则表达式可视化 Debuggex PCRE演示

如所接受的答案所示,在不支持向后查找的语言中,需要使用一种技巧,例如将第一个空格包含在匹配中,同时将重要内容保留在捕获组中:

(?:^|\s)(\d+)(?=\s|$)

正则表达式可视化 Debuggex JavaScript演示

然后你只需要从匹配结果中提取该捕获组,例如参见如何在JavaScript正则表达式中访问匹配的组?这个答案。


你为什么把 JavaScript 的那个编辑删除了,能不能把它留在那里? - syllogismos
1
这是程序相关内容的翻译,从英语翻译成中文。请只返回翻译后的文本:这个内容在@Avinash的回答中有重复,但我把它放回来了。 - Aprillion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接