从javascript中的字符串中提取所有数字

时间:2014-08-03 18:44:15

标签: javascript regex

我想要来自给定字符串的所有正确的自然数,

var a = "@1234abc 12 34 5 67 sta5ck over @ numbrs ."
numbers = a.match(/d+/gi)

在上面的字符串中我应该只匹配第一个单词5等中的数字12,34,5,67,而不是1234.

所以数字应该等于[12,34,5,67]

2 个答案:

答案 0 :(得分: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' ]

代码从here被盗。

答案 1 :(得分:2)

如果有人对正确的正则表达式解决方案感兴趣以匹配空格字符包围的数字,那么对于支持lookbehind的语言(如Perl和Python,但在撰写本文时不是JavaScript)很简单:

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

Regular expression visualization Debuggex PCRE Demo

如接受的答案所示,在不支持lookbehind的语言中,有必要使用hack,例如在比赛中包括第一个空格,同时将重要的东西保留在一个捕获组中:

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

Regular expression visualization Debuggex JavaScript Demo

然后你只需要从匹配中提取捕获组,参见例如这个答案How do you access the matched groups in a JavaScript regular expression?