匹配恰好5个数字的正则表达式

53
testing= testing.match(/(\d{5})/g);
我正在读取一个完整的HTML并将其存储到变量中。我想从该变量中提取所有具有恰好5个数字模式的数字。无需关心此数字之前/之后是否有其他类型的单词。只需确保抓取到的是5位数。
然而,当我尝试应用它时,它不仅会提取出恰好5位数的数字,还会检索超过5位数的数字...
我已经尝试在前面放置^和在后面放置$,但结果为空。

1
你能举个例子说明你实际上想做什么吗?你是在尝试在一个字符串中找到所有的五位数吗? - Wolph
我正在将整个HTML读入变量。从变量中,想要提取所有具有恰好5位数字模式的数字。 - i need help
您选择的答案与您所陈述的要求“不需要关心这个数字之前/之后是否有其他类型的单词”存在冲突(该措辞需要改进)。您并没有提到五位数字的字符串必须被单词边界包围。 - undefined
5个回答

85

我正在读取一个文本文件,想使用下面的正则表达式提取刚好有5位数字的内容,忽略字母。

尝试这个...

var str = 'f 34 545 323 12345 54321 123456',
    matches = str.match(/\b\d{5}\b/g);

console.log(matches); // ["12345", "54321"]

jsFiddle

单词边界 \b 在这里非常有用。

更新

我的正则表达式将匹配像 12345 这样的数字,但不会匹配像 a12345 这样的数字。如果您需要后者,其他答案提供了很好的正则表达式。


@Joel Etherton 刚刚尝试了一下,但它并不匹配。我可能漏掉了什么,请为我详细解释一下 :) - alex
@alex - 我的评论是在你使用 str.match(/\d{5}/g); 时发表的,它确实匹配了。 - Joel Etherton
这对于 34_545_323_12345_54321_123456 不起作用 :( 找不出问题所在。 - NaturalBornCamper
“_” 是一个单词字符,而不是边界(至少按照正则表达式的定义),请参见 /\w/.test('_') - alex
词边界!!太神奇了 - 我做正则表达式已经20年了,从来没有意识到这是一个事情。总是不得不用通配符玩游戏。感觉自己像个乡巴佬! - Yevgeny Simkin
显示剩余2条评论

11

以下是我用来测试的字符串:

testing='12345,abc,123,54321,ab15234,123456,52341';

如果我理解您的问题,您想要 ["12345", "54321", "15234", "52341"]

如果JS引擎支持正则表达式的向后查找,可以使用以下代码:

testing.match(/(?<!\d)\d{5}(?!\d)/g)

目前它不支持,你可以:

testing.match(/(?:^|\D)(\d{5})(?!\d)/g)

并从适当的结果中删除前导的非数字字符,或者:

pentadigit=/(?:^|\D)(\d{5})(?!\d)/g;
result = [];
while (( match = pentadigit.exec(testing) )) {
    result.push(match[1]);
}

请注意,在IE中,似乎需要使用一个存储在变量中的RegExp而不是在while循环中使用字面正则表达式,否则你会得到一个无限循环。


结果看起来很不错,加一。 - alex

3
这应该可以工作:
<script type="text/javascript">
var testing='this is d23553 test 32533\n31203 not 333';
var r = new RegExp(/(?:^|[^\d])(\d{5})(?:$|[^\d])/mg);
var matches = [];
while ((match = r.exec(testing))) matches.push(match[1]);
alert('Found: '+matches.join(', '));
</script>

虽然不清楚他是否想匹配d23553中的23553,但是含糊的问题真的很烦人! - Mark Eirich
如果 OP 确实 想匹配 d23553,那么我的正则表达式就相当不足了! :P - alex
我预计这种方法会比使用环视更高效。 - undefined

2

无需担心数字前/后是否带有其他类型的单词

为了匹配字符串中任何位置的5位数字模式,无论它们是否被空格分隔,使用此正则表达式(?<!\d)\d{5}(?!\d)

JavaScript 代码示例:

var regexp = new RegExp(/(?<!\d)\d{5}(?!\d)/g); 
    var matches = yourstring.match(regexp);
    if (matches && matches.length > 0) {
        for (var i = 0, len = matches.length; i < len; i++) {
            // ... ydo something with matches[i] ...
        } 
    }

以下是快速结果。

  • abc12345xyz (✓)

  • 12345abcd (✓)

  • abcd12345 (✓)

  • 0000aaaa2 (✖)

  • a1234a5 (✖)

  • 12345 (✓)

  • <space>12345<space>12345 (✓✓)


注:✓表示通过,✖表示未通过。

2

这是关于什么的?\D(\d{5})\D

这将会在以下内容中生效:

f 23 23453 234 2344 2534 hallo33333 "50000"

23453, 33333 50000


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