為什么我的正則運算式模式與字串的日期部分匹配?似乎我沒有/正確考慮(斜杠)[^\/]以避免匹配日期字串的模式?
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,...]
uj5u.com熱心網友回復:
您將獲得日期部分和未定義部分的匹配項,因為您使用了帶有可選部分和交替的模式 |
在你的模式中有這部分(\d [^\/]|\d{1,3}(,\d{3})*)。交替的第一部分\d [^\/]匹配 1 個數字,后跟除 a /(也可以匹配數字)之外的任何字符,并且最小字符數為 2。該部分將匹配日期部分中的 20、22 和 2021。
如果有 1 個數字,則交替的第二部分將匹配它。
如果您也只想匹配數字,您可以斷言不/向左和向右,并使用第一個選項(如 USD)使整個部分成為可選的,并且還可以使用可選的 whitspace 字符,以防止僅在數字之前匹配。
最后一個交替可以縮短為[km]?帶有不區分大小寫標志的字符類。
請參閱此頁面以了解對 Javascript的后視支持。
(?:(?:USD|\$|EUR|€|USDC|USDT)\s?)?(?<!\/)\b(?:\d{1,3}(?:,\d{3})*(?:\.\d )?|\d )(?!\/)[KkMm]?\b
正則運算式演示
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
正則運算式演示
uj5u.com熱心網友回復:
我不能很好地理解你的正則運算式。所以我試著弄清楚你會期望什么結果。檢查這個。在組中,您擁有字串的每個部分。
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)
塊參考
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/339331.html
標籤:javascript 正则表达式
上一篇:單擊2次時背景顏色更改
