Veramente le equazioni di secondo grado io le conosco in questa forma:
37x^2 + 4x + 7 = 0
dove il 37 e` il valore di $a, il 4 il $b e il 7 il $c (che possono anche essere espresse come y= ... , se si tratta di curve di secondo grado).
Probabilmente nel tuo progetto puoi imporre di avere tutto dalla stessa parte dell'uguale, in modo da semplificare l'estrazione.
L'ordine non e` significativo, quindi il programma deve anche riconoscere quali sono i vari termini.
Non so se si puo` fare tutto quanto scritto da me con un'unica RE. Forse si puo` se l'ordine e` sempre lo stesso, mentre la vedo dura se l'ordine puo` cambiare.
Comunque ecco una bozza (l'inizio del lavoro):
codice:
$str = '37x^2 + 4x + 7 = 0';
$str ~= s/\s//; # tolgo tutti gli spazi
$str ~= /^(.+?)([\+\-].+?)?([\+\-].+?)?=/;
# in $1, $2, $3 ora sono i tre pezzi, completi di segno
#Ora occorre capire dove e` contenuto x^2, dove x (senza ^2) e dove non c'e` la x
Se invece puoi imporre che l'ordine sia fisso, la cosa potrebbe diventare:
codice:
$str = '37x^2 + 4x + 7 = 0';
$str ~= s/\s//; # tolgo tutti gli spazi
$str ~= /^(?:(.*?)x\^2)?(?:([\+\-].*?)x)?(?:([\+\-].*?)?=/;
$a = $1;
$b = $2;
$c = $3;
# se uno dei campi e` vuoto o contiene solo il segno +, va sostituito con il valore 1,
# se contiene solo il segno - va sostituito con -1;
# negli altri casi va interpretato con sscanf