为什么我的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)
引用