正则表达式精确匹配 5 位数字

Posted

技术标签:

【中文标题】正则表达式精确匹配 5 位数字【英文标题】:regular expression to match exactly 5 digits 【发布时间】:2011-06-25 22:16:32 【问题描述】:
testing= testing.match(/(\d5)/g);

我正在将完整的 html 读入变量。从变量中,想要提取出所有恰好为 5 位数字的数字。无需关心这个数字之前/之后是否有其他类型的单词。只是想确保所有 5 位数字都被抓取出来。

但是,当我应用它时,它不仅提取出正好是 5 位的号码,还检索到超过 5 位的号码......

我曾尝试将^ 放在前面,$ 放在后面,但结果显示为空。

【问题讨论】:

你能举个例子来说明你真正想要做什么吗?您是否要查找字符串中的所有 5 位数字? 我正在将完整的 html 读入变量。从变量中,想要找出所有正好是 5 位数字的数字。 【参考方案1】:

我的测试字符串如下:

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

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

如果 JS 引擎支持正则表达式lookbehinds,你可以这样做:

testing.match(/(?<!\d)\d5(?!\d)/g)

由于目前没有,您可以:

testing.match(/(?:^|\D)(\d5)(?!\d)/g)

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

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

请注意,对于 IE,您似乎需要在 while 循环中使用 RegExp stored in a variable 而不是文字正则表达式,否则您将获得无限循环。

【讨论】:

那里的结果看起来不错,+1。【参考方案2】:

不用关心这个数字之前/之后是否有其他类型的词

要匹配字符串中任意位置的 5 位数字的模式,无论是否用空格分隔,请使用此正则表达式 (?&lt;!\d)\d5(?!\d)

示例 javascript 代码:

var regexp = new RegExp(/(?<!\d)\d5(?!\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 (✓)

&lt;space&gt;12345&lt;space&gt;12345 (✓✓)

【讨论】:

【参考方案3】:

我正在阅读一个文本文件,并想使用下面的正则表达式来提取正好为 5 位的数字,忽略字母。

试试这个...

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

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

jsFiddle.

单词边界\b是你这里的朋友。

更新

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

【讨论】:

@Joel Etherton 刚试了一下,不匹配。我可能遗漏了一些东西,请为我详细说明:) @alex - 我的评论是在您在str.match(/\d5/g); 获得时发表的,并且确实匹配。 @Joel Etherton 是的,这是一个仓促的答案并且不正确。希望这个新的没问题:) @alex - +1 现在你有单词边界了。 :) 这不适用于 34_545_323_12345_54321_123456 :( 想不通这个【参考方案4】:

这是怎么回事? \D(\d5)\D

这将在:

f 23 23453 234 2344 2534 hallo33333 "50000"

23453, 33333 50000

【讨论】:

【参考方案5】:

这应该可行:

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

【讨论】:

虽然不清楚他要不要匹配d23553中的23553……含糊的问题太烦人了! .. 如果 OP 确实 想要匹配 d23553,my regex 是完全不够的! :P

以上是关于正则表达式精确匹配 5 位数字的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配时间格式的 1 位数字并替换为 2 位数字

php正则 匹配 手机、座机号码

C#正则表达式匹配方括号

求一个正则表达式 匹配:7位数字 或者 7位数字,7位数字 或者 7位数字,7位数字,7位数字。。。

正则表达式从字符串中精确匹配 11 位电话号码并从 C# 中的匹配中删除连字符(-)

正则表达式入门-20161122