Soy un novato en las expresiones regulares, por lo que agradecería un poco de comentarios de los compañeros sobre este. Se usará mucho en mi sitio, por lo que cualquier caso de bordes extraños puede causar estragos. La idea es escribir una cantidad de un ingrediente en una receta en unidades enteras o fracciones. Debido a mi mecanismo de autocompletar, solo un número es válido también (ya que aparecerá un menú desplegable). Estas líneas son válidas:¿Alguna forma de mejorar esta expresión regular?
1
1/2
1 1/2
4 cups
4 1/2 cups
10 3/4 cups sliced
La parte numérica de la línea debe ser su propio grupo para que pueda analizar que con mi analizador fracción. Todo después de la parte numérica debe ser un segundo grupo. Al principio, he intentado esto:
^\s*(\d+|\d+\/\d+|\d+\s*\d+\/\d+)\s*(.*)$
Esto casi funciona, pero "1 1/2 tazas" se analiza como conseguir (1) (1/2 taza) en vez de (1 1/2) y (tazas) Después de rascarme un poco la cabeza, determiné que esto se debía al orden de mi cláusula "O". (1) satisface el \ d + y (. *) Satisface el resto. Así que cambié a este:
^\s*(\d+\/\d+|\d+\s*\d+\/\d+|\d+)\s*([a-z].*)$
Esto casi funciona, pero permite rarezas como "1 1/2/4 tazas" o "1/2 3 tazas". Así que decidí hacer cumplir una letra como primer carácter después de una expresión numérica válida:
^\s*(\d+\/\d+|\d+\s*\d+\/\d+|\d+)\s*($|[a-z].*)$
Nota estoy corriendo esta en el modo de mayúsculas y minúsculas. Aquí están mis preguntas:
¿Se puede mejorar la expresión? Me gusta un poco la lista "O" para el número, la fracción, la fracción compuesta, pero no se me ocurrió una forma de permitir números enteros, fracciones o fracciones compuestas.
Sería muy agradable si pudiera devolver un grupo para cada palabra después del componente numérico. Como un grupo para (10 3/4), un grupo para (tazas) y un grupo para (rebanadas). Puede haber cualquier cantidad de palabras después. es posible?
Gracias!
Oh uy, se perdió un caso más .. La cantidad puede expresarse en decimales. Así que agregué una cláusula O más: ^ \ s * (\ d + \/\ d + | \ d + \ s * \ d + \/\ d + | \ d + | \ d * \. \ D) \ s * ($ | [az]. *) $ –