Estoy tratando de hacer coincidir el siguiente patrón:
((1.0 4) (2.0 5) .... (10.0 8)) La tupla (XN) , donde X es un número de punto flotante con exponente opcional y N es un número entero, se puede repetir varias veces.
Probé en este sitio web y pude generar una expresión regular para un número fijo de tuplas. Por ejemplo para 2 tuplas obtendría
^\(\(([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[eE]([+-]?\d+))?\s[0-9]+\)\s\(([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[eE]([+-]?\d+))?\s[0-9]+\)\)$¿Cómo puedo modificar el patrón para que el número de tuplas sea arbitrario? Creo que tendré que usar algún tipo de agrupación, pero regex es bastante nuevo para mí.
Puedes usar el siguiente patrón:
^\(\(\d+(?:\.\d+)? \d+\)(?:\s*\(\d+(?:\.\d+)? \d+\))*\)$Este patrón coincide con:
^ \( ( \(\d+(?:\.\d+)? \d+\) a leading tuple (?:\s*\(\d+(?:\.\d+)? \d+\))* space, more tuples \) ) $"La tupla (XN), donde X es un número de punto flotante con exponente opcional y N es un número entero , se puede repetir varias veces".
Para asegurarse de tener 1+ tuplas (con exponentes opcionales), puede usar:
^\(\([-+]?\d*\.\d+([eE][-+]?\d+)?\s\d+\)(?:\s\([-+]?\d*\.\d+([eE][-+]?\d+)?\s\d+\))*\)$Ver una demostración en línea
^ - Anclaje de línea de salida;\(\( - Dos paréntesis de apertura literales;[-+]?\d*\.\d+([eE][-+]?\d+)? - Para hacer coincidir su número de coma flotante con un exponente opcional, hacemos coincidir: un guión opcional o un signo más seguido de 0+ dígitos y un punto literal con 1+ dígitos. Después de eso, hay un grupo de captura opcional para hacer coincidir el exponente con una letra 'e', un guión opcional o más y 1+ dígitos;\s\d+\) - Para finalizar la tupla, el patrón coincide con: Un solo carácter de espacio en blanco y 1+ dígitos para coincidir con la parte entera de la tupla antes de un paréntesis de cierre;(?:\s.....)* - El truco a continuación es que usamos un grupo que no es de captura para hacer coincidir un único carácter de espacio en blanco y el patrón que usamos para nuestra tupla. Al cerrar este grupo de no captura, haga coincidir 0+ veces para permitir cualquier número de tuplas;\)$ - Termina el patrón con un paréntesis de cierre literal y el ancla de la línea final.O, si está disponible, captura la primera tupla en un grupo de captura y repite ese patrón exacto con una referencia inversa:
^\((\([-+]?\d*\.\d+([eE][-+]?\d+)?\h\d+\))(?:\h(?1))*\)$Ver una demostración en línea
Puede verificar el patrón haciendo coincidir la cadena con la siguiente expresión regular.
^\((?:\(\d+\.\d(?: \d+)?\)(?: |(?=\)$)))+\)$La expresión regular se puede dividir de la siguiente manera.
^ # match beginning of string \( # match '(' (?: # begin non-capture group \( # match '(' \d+\.\d # match 1+ digits, '.', 1 digit (?: \d+)? # optionally ('?') match a space then 1+ digits \( # match ')' (?: # begin non-capture group [ ] # match a space | # or (?=\)$) # positive lookahead asserts next char is ')' at end of string ) # end non-capture group )+ # end non-capture group and execute one or more times \) # match ')' $ # match end of string