estaba tratando de crear una expresión regular que pudiera coincidir con los números entre paréntesis o no, por ejemplo:
(1.000.000,00) //match (1.000,00) //match (100,00) //match (10) //match (1) //match (2.000.000,00 //dont't match (2.000,00 //dont't match (200,00 //dont't match (20 //dont't match (2 //dont't match 3.000.000,00) //dont't match 3.000,00) //dont't match 300,00) //dont't match 30) //dont't match 3) //dont't match 4.000.000,00 //should match 4.000,00 //should match 400,00 //should match 40 //should match 4 //should matchNecesito hacer coincidir solo números (entre paréntesis o no), pero solo si tienen todos los corchetes (2) o ninguno (0)
Por el momento esto es lo que se me ocurrió: \((\d+[\.,]?)+\d*\) , coincide con --match y no coincide con --dont match pero debería coincide también con --debería coincidir
Agregué la etiqueta javascript porque estoy usando esta expresión regular en js y no todos los tokens de expresión regular funcionan en el constructor js regex
Estoy publicando también un enlace regex101
Si es compatible, puede usar una mirada negativa hacia atrás para hacer coincidir con o sin paréntesis:
\(\d+(?:[.,]\d+)*\)|(?<!\S)\d+(?:[.,]\d+)*(?!\S)\( Partido (\d+(?:[.,]\d+)* Coincide con 1+ dígitos y, opcionalmente, repite la coincidencia . o , y nuevamente 1+ dígitos\) Partido )| O(?<!\S) Negativo mirar hacia atrás, afirmar un límite de palabra a la izquierda\d+(?:[.,]\d+)* Coincide con 1+ dígitos y, opcionalmente, repite la coincidencia . o , y nuevamente 1+ dígitos(?!\S) Anticipación negativa, afirmar un límite de espacio en blanco a la derechaDemostración de expresiones regulares
Otra opción podría ser hacer coincidir paréntesis opcionales en ambos lados, y solo mantener los que tienen un paréntesis de apertura y cierre, o ninguno.
const regex = /\(?\d+(?:[.,]?\d+)*\)?/ const strings = ["(1.000.000,00)", "(1.000,00)", "(100,00)", "(10)", "(1)", "(2.000.000,00", "(2.000,00", "(200,00", "(20", "(2", "3.000.000,00)", "3.000,00)", "300,00)", "30)", "3)", "4.000.000,00", "4.000,00", "400,00", "40", "4"]; strings.forEach(s => { const m = s.match(regex); const firstChar = s.charAt(0); const lastChar = s.charAt(s.length - 1); if ( m && (firstChar !== '(' && lastChar !== ')') || firstChar === '(' && lastChar === ')' ) { console.log(s) } });Editar: esto está roto. Coincidirá con números como (7, ya que solo coincide con el número e ignora los paréntesis en ese caso.
Conservado aquí para referencia futura.
Por lo general, es más fácil hacer expresiones regulares en varias pasadas, pero aquí va:
/(\((\d+[\.,]?)+\d*\))|(\d+[\.,]?\d*)/gmPuede probarlo en https://regex101.com/ . Por lo general, es mejor procesar algo en varias pasadas, ya que puede ver que la expresión regular se vuelve aún más ilegible. Tomé su expresión regular y la dividí en dos expresiones regulares: una que requiere los paréntesis y otra que no, luego las combiné con el operador o. Tenga en cuenta que esta expresión regular permitirá cosas como "123.3,5.7" como un número, y los grupos de captura serán desagradables.
Si no desea repetir los números de coincidencia de partes (que en este caso es corto, por lo que tal vez se justifique una excepción a la regla DRY), puede buscar \(?((\d+[\.,]?)+\d*)\)?(?<=\(\1\)|(^|[^(\d.,])\1(?=($|[^\d.,)]))) .