javascript 有没有一个正则表达式可以将10个数字(通常是不连续的)放入一个命名的捕获组中?

9rnv2umw  于 2023-10-14  发布在  Java
关注(0)|答案(2)|浏览(74)

我有一个用户输入字符串,应该包含至少10位数字,但他们可能是不连续的。在这些可能的用户输入中:

"What is 12? Can we 345 the loan to 678-90"
">>123456789--0"
"1234567890541112144847-909"
"Maybe try 123456 with 7890 too"

我需要一个正则表达式来给予match.groups.anyTen = '1234567890'
我试过/\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})/
/(?<anyTen>\D*(\d\D*){10})/
fxnxkyjh

fxnxkyjh1#

不能有一个由非连续匹配项组成的组。
你可以做的是匹配前10位数字,然后从中删除非数字。
注意\D也匹配换行符。
如果需要10位或更多位数,则量词将变为{9,}

const s = `"What is 12? Can we 345 the loan to 678-90"
">>123456789--0"
"1234567890541112144847-909"
"Maybe try 123456 with 7890 too"`;

const regex = /^[^\d\n]*(?<anyTen>\d(?:[^\d\n]*\d){9})/gm;
const result = Array.from(
  s.matchAll(regex), m =>
  m.groups.anyTen.replace(/\D+/g, "")
);
console.log(result)

另一个选项可以是修改groups.anyVal属性的值:

const s = "What is 12? Can we 345 the loan to 678-90";
const regex = /^[^\d\n]*(?<anyTen>\d(?:[^\d\n]*\d){9})/;
const result = regex.exec(s);

if (result) {
  result.groups.anyTen = result.groups.anyTen.replace(/\D+/g, "");
  console.log(result.groups.anyTen);
}
ffscu2ro

ffscu2ro2#

可以使用以下正则表达式模式:

(?<anyTen>(?:\D*\d){10,})
  • (?<anyTen> ... ):这是一个名为“anyTen”的命名捕获组。
  • (?: ... ):这是一个非捕获组。它允许我们对模式进行分组,而无需创建单独的捕获组。
  • \D*:匹配零个或多个非数字字符。
  • \d:匹配一个数字。
  • {10,}:至少匹配前一个模式(非数字后跟数字)10次。

使用方法:

const input = "What is 12? Can we 345 the loan to 678-90";
const regex = /(?<anyTen>(?:\D*\d){10,})/;
const match = input.match(regex);

if (match) {
  const anyTen = match.groups.anyTen.replace(/\D/g, ''); // Remove non-digit characters
  console.log(anyTen);
} else {
  console.log("No match found.");
}

这将输出:

1234567890

相关问题