Estoy tratando de hacer coincidir la siguiente secuencia, línea por línea:
Kdfloat cuyo formato puede ser desordenadoEl problema es que la cuarta muestra también se captura a pesar de que tiene 5 números.
Patrón:
^\s*Kd\s+.*(?:[-+]?0*\d*\.?\d*){3,4}$Muestras:
Kd 1.0 0.1 0.0 Kd .0 4. 01. Kd .0 4. 01. 01. Kd .0 4. 01. 01. 01. Kd 1.0 0.1 0.0 0.0 Kd 1.0 0.1 0.0Capturas esperadas:
Pregunta:
¿Qué estoy haciendo mal en la expresión regular para que también coincida con las líneas con más de 4 flotantes en ellas?
El principal problema es la parte .* que coincide con cero o más caracteres que no sean un carácter LF, tantas veces como sea posible. También debe colocar \s+ en el grupo repetido para permitir espacios en blanco entre los valores numéricos.
Puedes usar
^\s*Kd(?:\s+([-+]?(?:\d*\.?\d+|\d+\.\d*))){3,4}$Consulte la demostración de expresiones regulares de .NET . Detalles :
^ - comienzo de la cadena\s* - cero o más espacios en blancoKd - una cadena fija(?:\s+([-+]?(?:\d*\.?\d+|\d+\.\d*))){3,4} - tres a cuatro ocurrencias de\s+ - uno o más espacios en blanco([-+]?(?:\d*\.?\d+|\d+\.\d*)) - Grupo 1:[-+]? - un opcional - o +(?:\d*\.?\d+|\d+\.\d*) - cero o más dígitos, un . y uno o más dígitos, o uno o más dígitos, . y cero o más dígitos$ - final de la cadena.