正则表达式匹配日期中的数字,但不应匹配



为什么我的regex模式匹配字符串的日期部分?似乎我没有用[^/]正确地解释/(斜杠),以避免匹配日期字符串的模式?

const reg = new RegExp(
/(USD|$|EUR|€|USDC|USDT)?s?(d+[^/]|d{1,3}(,d{3})*)(.d+)?(k|K|m|M)?b/,
"i"
);
const str = "02/22/2021 $50k";
console.log(reg.exec(str));
// result: ['02', undefined, '02', undefined, undefined, undefined, undefined, index: 0, input: '02/22/2021 $50k', groups: undefined]
// was expecting: [$50k,...]

您将获得日期部分和未定义部分的匹配,因为您使用具有可选部分和更改的模式|

在您的模式中有这部分(d+[^/]|d{1,3}(,d{3})*)d+[^/]的第一部分匹配1+数字,后面跟着除/(也可以匹配数字)以外的任何字符,最小字符数为2。该部分将与日期部分中的20,22和2021相匹配。

如果有1个数字,则替换的第二部分将与之匹配。


如果你想只匹配数字,你可以断言不是/到左和右,并使整个部分与第一个选项,如USD可选的可选的空白字符,以及,以防止匹配之前只有数字。

最后一个选项可以缩短为具有不区分大小写标志的字符类[km]?

Javascript的后台支持见此页

(?:(?:USD|$|EUR|€|USDC|USDT)s?)?(?<!/)b(?:d{1,3}(?:,d{3})*(?:.d+)?|d+)(?!/)[KkMm]?b

Regex演示

const reg = /(?:(?:USD|$|EUR|€|USDC|USDT)s?)?(?<!/)b(?:d{1,3}(?:,d{3})*(?:.d+)?|d+)(?!/)[KkMm]?b/gi;
const str = "02/22/2021 $50k 1,213.3 11111111 $50,000 $50000"
const res = Array.from(str.matchAll(reg), m => m[0]);
console.log(res)

如果货币不是可选的:

(?:USD|$|EUR|€|USDC|USDT)s?(?:d{1,3}(?:,d{3})*(?:.d+)?|d+)[KkMm]?b

Regex演示

我看不懂你的正则表达式。所以我试着找出你期望的结果。检查这个。在组中,你有字符串的每个部分。

const regex = /(d{2})*/?(d{2})/(d{2,4})?s*(USD|$|EUR|€|USDC|USDT)?(d*)(k|K|m|M)?b/i
const regexNamed = /(?<day>d{2})*/?(?<month>d{2})/(?<year>d{2,4})?s*(?<currency>USD|$|EUR|€|USDC|USDT)?(?<value>d*)(?<unit>k|K|m|M)?b/i
const str1 = '02/22/2021 $50k'
const str2 = '02/2021 €50m'
const m1 = str1.match(regex)
const m2 = str2.match(regexNamed)
console.log(m1)
console.log(m2.groups)

引用

相关内容

  • 没有找到相关文章

最新更新