You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式将非连续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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 21:25:03