testing= testing.match(/(\d{5})/g);
我正在读取一个完整的HTML并将其存储到变量中。我想从该变量中提取所有具有恰好5个数字模式的数字。无需关心此数字之前/之后是否有其他类型的单词。只需确保抓取到的是5位数。然而,当我尝试应用它时,它不仅会提取出恰好5位数的数字,还会检索超过5位数的数字...
我已经尝试在前面放置
^
和在后面放置$
,但结果为空。testing= testing.match(/(\d{5})/g);
我正在读取一个完整的HTML并将其存储到变量中。我想从该变量中提取所有具有恰好5个数字模式的数字。无需关心此数字之前/之后是否有其他类型的单词。只需确保抓取到的是5位数。^
和在后面放置$
,但结果为空。我正在读取一个文本文件,想使用下面的正则表达式提取刚好有5位数字的内容,忽略字母。
尝试这个...
var str = 'f 34 545 323 12345 54321 123456',
matches = str.match(/\b\d{5}\b/g);
console.log(matches); // ["12345", "54321"]
单词边界 \b
在这里非常有用。
我的正则表达式将匹配像 12345
这样的数字,但不会匹配像 a12345
这样的数字。如果您需要后者,其他答案提供了很好的正则表达式。
str.match(/\d{5}/g);
时发表的,它确实匹配了。 - Joel Etherton/\w/.test('_')
。 - alex以下是我用来测试的字符串:
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
循环中使用字面正则表达式,否则你会得到一个无限循环。
<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>
无需担心数字前/后是否带有其他类型的单词
为了匹配字符串中任何位置的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 (✓✓)
这是关于什么的?\D(\d{5})\D
这将会在以下内容中生效:
f 23 23453 234 2344 2534 hallo33333 "50000"
23453, 33333 50000