如何用正则表达式将非连续10位数字存入命名捕获组?
提取字符串里前10位非连续数字到命名组
需求
手里有一堆字符串,每个里面至少有10位数字,但数字可能不是连在一起的。要通过正则表达式提取出前10位数字,最终得到match.groups.anyTen = '1234567890'。
举几个输入例子:
"What is 12? Can we 345 the loan to 678-90" ">>123456789--0" "1234567890541112144847-909" "Maybe try 123456 with 7890 too"
之前试过的无效写法
这些正则都没达到预期:
/\d+/g:能抓到所有连续数字块,但没法把它们合并到同一个命名组里/(?<anyTen>\d+/g:只能给第一个连续数字块命名,后面的数字都没算进去/(?<anyTen>\d\D*\d\D*\d\D*\d\D*\d\D*\d\D*\d\D*\d\D*\d\D*\d\D*)/:结果里会混进数字之间的非数字字符,不是纯数字串/(?<anyTen>\d{1,10})/:只抓连续的1到10位数字,非连续的情况直接忽略/(?<anyTen>\D*(\d\D*){10})/:同样会包含非数字字符,不符合要求
可行的解决办法
纯正则其实很难直接把分散的数字拼成一个纯数字的命名组(大部分正则引擎不支持自动拼接非连续的匹配内容),可以结合正则匹配+后续处理,或者先预处理字符串再用正则:
方法1:先抓所有数字再截取
用全局正则把所有数字都抓出来,拼成字符串后取前10位:
const input = "What is 12? Can we 345 the loan to 678-90"; const allDigits = input.match(/\d/g).join(''); const anyTen = allDigits.slice(0, 10); // 得到 '1234567890'
方法2:预处理+正则命名组(以JavaScript为例)
先把字符串里的非数字字符都删掉,再用正则捕获前10位到命名组:
const regex = /(?<anyTen>(?:\d){10}).*/; const processedInput = input.replace(/\D/g, ''); const match = processedInput.match(regex); console.log(match.groups.anyTen); // 输出 '1234567890'
方法3:单一正则(仅部分引擎支持,比如.NET)
.NET的正则引擎可以用正向预查来匹配,但需要多次匹配后拼接,操作起来不如前两种方法直观,一般不推荐。
总的来说,追求简单直接就用方法1;如果必须通过正则命名组直接拿到结果,就用方法2先预处理字符串。
内容的提问来源于stack exchange,提问作者Hoshi
相关产品推荐
相关产品推荐

