¿Por qué mi patrón de expresiones regulares coincide con la parte de la fecha de la cadena? Parece que no estoy teniendo en cuenta la / (barra oblicua) correctamente con [^\/] para evitar que el patrón coincida con las cadenas de fecha.
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,...]Obtiene esas coincidencias para la parte de la fecha y las indefinidas, porque usa un patrón con partes y alternancias opcionales |
En tu patrón hay esta parte (\d+[^\/]|\d{1,3}(,\d{3})*) . Esa primera parte de la alternancia \d+[^\/] coincide con 1+ dígitos seguidos de cualquier carácter excepto / (que también puede coincidir con un dígito) y la cantidad mínima de caracteres es 2. Esa parte coincidirá con 20, 22 y 2021 en la parte de la fecha.
Si hay 1 dígito, la segunda parte de la alternancia lo coincidirá.
Si también desea hacer coincidir solo números, puede afirmar no / a la izquierda y a la derecha, y hacer que la parte completa con las primeras alternativas como USD sea opcional con los caracteres de espacio en blanco opcionales también, para evitar que coincidan solo antes de dígitos.
¿La última alternancia se puede acortar a una clase de carácter [km]? con una bandera que no distingue entre mayúsculas y minúsculas.
Consulte esta página para conocer el soporte de búsqueda posterior para Javascript.
(?:(?:USD|\$|EUR|€|USDC|USDT)\s?)?(?<!\/)\b(?:\d{1,3}(?:,\d{3})*(?:\.\d+)?|\d+)(?!\/)[KkMm]?\bDemostración de expresiones regulares
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)Si la moneda no es opcional:
(?:USD|\$|EUR|€|USDC|USDT)\s?(?:\d{1,3}(?:,\d{3})*(?:\.\d+)?|\d+)[KkMm]?\bNo puedo entender bien tu expresión regular. así que trato de averiguar qué resultado esperaría. Mira esto. en grupos tienes cada parte de tu cadena.
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)Cita en bloque