我想要来自给定字符串的所有正确的自然数,
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]
答案 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|$)
如接受的答案所示,在不支持lookbehind的语言中,有必要使用hack,例如在比赛中包括第一个空格,同时将重要的东西保留在一个捕获组中:
(?:^|\s)(\d+)(?=\s|$)
然后你只需要从匹配中提取捕获组,参见例如这个答案How do you access the matched groups in a JavaScript regular expression?