Sono un principiante alle espressioni regolari, quindi apprezzerei un po 'di feedback tra pari su questo. Sarà pesantemente utilizzato sul mio sito, quindi qualsiasi caso limite strano può totalmente devastare. L'idea è di digitare una quantità di un ingrediente in una ricetta in unità intere o frazioni. A causa del mio meccanismo di completamento automatico, solo un numero è valido (dato che verrà visualizzato un menu a discesa). Queste linee sono valide:Qualche modo per migliorare questa espressione regolare?
1
1/2
1 1/2
4 cups
4 1/2 cups
10 3/4 cups sliced
la parte numerica della linea dovrebbe essere il suo gruppo in modo da poter analizzare che con il mio frazione parser. Tutto dopo la parte numerica dovrebbe essere un secondo gruppo. In un primo momento, ho provato questo:
^\s*(\d+|\d+\/\d+|\d+\s*\d+\/\d+)\s*(.*)$
Questo quasi funziona, ma "1 1/2 tazze" andranno analizzato come (1) (1/2 tazze) invece di (1 1/2) e (coppe). Dopo avermi grattato un po 'la testa, ho capito che questo era dovuto all'ordinamento della mia clausola "OR". (1) soddisfa \ d + e (. *) Soddisfa il resto. Così ho cambiato questo:
^\s*(\d+\/\d+|\d+\s*\d+\/\d+|\d+)\s*([a-z].*)$
Questo funziona quasi, ma permette di stranezze, come "1 1/2/4 tazze" o "1/2 3 tazze". Così ho deciso di far rispettare una lettera come primo carattere dopo un'espressione numerica valida:
^\s*(\d+\/\d+|\d+\s*\d+\/\d+|\d+)\s*($|[a-z].*)$
Nota Io corro questo in modalità case-insensitive. Ecco le mie domande:
È possibile migliorare l'espressione? Non mi piace la lista "OR" per numero, frazione, frazione composta ma non riesco a pensare a un modo per consentire numeri interi, frazioni o frazioni composte.
Sarebbe molto più bello se potessi restituire un gruppo per ogni parola dopo il componente numerico. Come un gruppo per (10 3/4), un gruppo per (tazze) e un gruppo per (a fette). Ci può essere un numero qualsiasi di parole dopo. È possibile?
Grazie!
Oh oops, manca un altro caso .. L'importo può essere espresso in decimale. Quindi ho aggiunto un'altra clausola OR: ^ \ s * (\ d + \/\ d + | \ d + \ s * \ d + \/\ d + | \ d + | \ d * \. \ D) \ s * ($ | [az]. *) $ –