Domanda

Come posso convalidare equazioni lineari con espressioni regolari o esiste un altro modo oltre all'utilizzo delle espressioni regolari.Utilizzerò ^ per denotare un esponente.

2x + 3 = 8 //Questo dovrebbe essere valido

3x + 2y + 4z = 12 //Questo dovrebbe essere valido

4x^2 + 2y = 22 //Questo non dovrebbe essere valido a causa della potenza.

4xy + 3y = 45 //Questo non dovrebbe essere valido a causa del prodotto di due incognite.

2/x + 4y = 22 //Questo non dovrebbe essere valido a causa dell'incognita nel denominatore

(3/4)x + 3y + 2z = 40 //Questo dovrebbe essere convalidato correttamente.

È stato utile?

Soluzione

Inizierei scrivendo una definizione di un'equazione lineare valida utilizzando Backus-Naur notazione, con cose come:

<integer> := <digit> | <integer> <digit>
<constant> := <integer> | ...
<variable> := <letter>
<term> := <constant> | <variable> | <constant> <variable>

e così via.

Esistono molti modi per trasformarlo in un validatore.Avendo una certa esperienza con esso, utilizzerei yacc o bison per scrivere un parser che genererebbe un albero di analisi solo se l'input fosse un'equazione lineare valida.

Potresti scoprire che le espressioni regolari sono troppo limitate per fare ciò di cui hai bisogno: semplicemente non le uso abbastanza per saperlo.

Altri suggerimenti

I casi che hai citato sono semplici:

fail if /[xyz]\s*\^/;
fail if /\/\s*[xyz]/;
fail if /([xyz]\s*){2,}/;

(questa è la sintassi Perl, presupponendo $_ contiene l'espressione e fail è qualunque cosa tu faccia quando vuoi arrenderti.)

Qui puoi sostituire xyz con qualunque sia un'espressione valida per una variabile.

Ma in generale ciò richiederà un'effettiva analisi dell'espressione, che è un lavoro per lex/yacc o qualcosa del genere, non un'espressione regolare.

Ad esempio, se "xy" è un nome di variabile legittimo, ovviamente tutto si sgretola.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top