Tengo una expresión regular que me da grupos separados de cadenas.
expresión regular antigua
const regex = /^(.*?)((?:\d{1,3}(?:,\d{1,3})*|\d+)(?:\.\d{1,5})?)(\D.*)?$/g;nueva expresión regular que escribí pero no estoy seguro si es correcta
const regex = /^(.*?)((?:([^\w\*])|(\d{1,3})(?:,\d{1,3})*|\d+)(?:\.\d{1,5})?)(\D.*)?$/g aquí está mi explicación de expresiones regulares, que principalmente solía tener números en el Group 2 pero ahora que mi rango de entrada está aumentando, quiero que también - reconozca (carácter que no es una palabra).
Pero no sé si es posible agregar el Group 2 -
PD: no habrá ningún carácter diferente que no sea - o numbers La entrada es la siguiente
const inputs= ["$200","$(200)%","100%","$-","$(52,000.5617)%","$30,000","45,444%"]; const regex = /^(.*?)((?:([^\w\*])|(\d{1,3})(?:,\d{1,3})*|\d+)(?:\.\d{1,5})?)(\D.*)?$/g; const text = inputs.match(regex); let [_, preText = "", number = "", postText = ""] = text; 1. ^ - start of string (.*?) - Group 1 (preText): any zero or more chars other than line break chars, as few as possible 2. ((?:\d{1,3}(?:,\d{1,3})*|\d+)(?:\.\d{1,5})?) - Group 2 (number): one to three digits followed with zero or more occurrences of a comma and one to three digits, or just one or more digits, and then an optional sequence of a . and one to five digits 3. (\D.*)? - Group 3 (postText), optional: a non-digit char and then any zero or more chars other than line break chars, as many as possible $ - end of string.Producción:
[_ = "$(52,000.5617)%", preText = "$", number = "52,000.5617", postText = ")%"] [_ = "$-", preText = "$", number = "-", postText = ""]preText [_ = "45,444%", preText = "", number = "45,444", postText = "%"]Puede hacer que el patrón sea un poco más específico y luego permitir/no permitir lo que desea capturar.
Puede usar 3 grupos de captura opcionales que no tengan coincidencias superpuestas y usar una búsqueda anticipada negativa que no coincida con una cadena vacía.
^(?!$)(\$?[^\d\n-]*)(-?(?:\d{1,3}(?:,\d{3})*(?:\.\d{1,5})?|\d+)?)([^\d\n]*)$Explicación
^ Comienzo de cadena(?!$) Afirma no directamente el final de la cadena(\$?) Grupo de captura 1 , emparejar $ opcional[^\d\n-]* Opcionalmente, haga coincidir caracteres que no sean un dígito, nueva línea o -( Grupo de captura 2-? Partido opcional -(?: grupo de no captura\d{1,3} Coincide con 1-3 dígitos(?:,\d{3})* Repetir 1+ veces , 3 dígitos(?:\.\d{1,5})? Partido opcional . y 1-5 dígitos| O\d+ Coincide con 1+ dígitos)? Cierre el grupo de no captura y hágalo opcional) Cerrar grupo 2([^\d\n]*) Capturar el grupo 3 , hacer coincidir los caracteres que no sean un dígito o una nueva líneaDemostración de expresiones regulares
const inputs = ["$200", "$(200)%", "100%", "$-", "$(52,000.5617)%", "$30,000", "45,444%"]; const regex = /^(?!$)(\$?[^\d\n-]*)(-?(?:\d{1,3}(?:,\d{3})*(?:\.\d{1,5})?|\d+)?)([^\d\n]*)$/; inputs.forEach(s => { const m = s.match(regex); if (m) { let [_, preText = "", number = "", postText = ""] = m; console.log("input --> " + s); console.log("preText --> " + preText); console.log("number --> " + number); console.log("postText --> " + postText); console.log("------------------------------------"); } });