2009-09-16 14 views
6

Sto lavorando su alcuni compiti per la mia classe del compilatore e ho il seguente problema:È possibile semplificare ulteriormente questa espressione regolare?

Scrivi un'espressione regolare per tutte le stringhe di un 's e b' s che contengono un numero dispari di a o un numero dispari di b (o entrambi).

Dopo un sacco di lavoro lavagna mi si avvicinò con la seguente soluzione:

(aa|bb)* (ab|ba|a|b) ((aa|bb)* (ab|ba) (aa|bb)* (ab|ba) (aa|bb)*)* 

tuttavia, è questo è il più semplificata posso farlo? Ho preso in considerazione la costruzione del DFA cercando di ridurre al minimo il numero di stati lì per vedere se mi avrebbe aiutato a semplificare, ma ho pensato di chiedere prima il gergo regex su SO.

+0

Quali sono le funzioni avanzate di regex che è consentito utilizzare? –

+6

usa espressioni regolari in Informatica, non in PCRE o in rexx di posix;) Sono diverse. –

+1

@ Brad Gilbert, presumo che ci sia consentito solo di usare la regex che è stata introdotta finora nel libro che non è molto. (*, +,?, |, [], ^). Abbastanza semplice –

risposta

8

Prendere Greg D's raccomandazione di iniziare con un (aa) *, e andare da lì. Sepp2k ha quasi ragione, ma la vera considerazione è che non ti interessa l'altra lettera. Quello che voglio dire è che quando guardi al vincolo "numero dispari di a", non ti importa di cosa sono i b nella tua stringa. Così, bastone b * 's ovunque è possibile :)

risposta di Sepp2k è quasi giusto, ma questo è corretto:

b* a b* (a b* a b*)* | a* b a* (b a* b a*)* 

Elaborare, questa regex capisce tutte le stringhe con un numero dispari di una di (prima sezione) e OR quelle stringhe con qualsiasi stringa contenente un numero dispari di b.

+0

@Walt W, sto gestendo questo a modo suo, ma penso che tu abbia ragione. – mmcdole

+0

per favore dimmi l'espressione regolare per qualsiasi stringa che contenga un numero pari di a e un numero pari di b? –

+0

Vuoi dire un numero pari di A o un numero pari di b? Suppongo che tu possa fare un AND con lookaheads di lunghezza zero ... Comunque non è roba standard di regex. Se si desidera modificare questa equazione da dispari a pari, basta rilasciare i primi due termini di ogni segmento (b * a dal lato sinistro e a * b dal lato destro) –

2

Ho paura di non credere che la sua espressione regolare sia corretta. Si consideri la stringa:

aba 

Abbiamo una scelta di coppia per le gare, ma il fatto che è strano di lunghezza significa che dobbiamo abbinare un un solitario nella parte anteriore, in modo da:

(a)(ba) 

Ma, purtroppo , è impossibile che il tuo secondo gruppo principale vi corrisponda (ba).

Quando si ha a che fare con un vincolo come questo, ho trovato più semplice iniziare dal vincolo principale e andare da lì. In questo caso, il vincolo è "strano", in modo da iniziare con

a(aa)* 

per forzare un numero dispari di a 's e passare da lì. :)

+0

@Greg D, è vero. Lasciami pensare per un secondo. – mmcdole

5

Questo dovrebbe funzionare:

b* a b* (a b* a b*)* | a* b a* (b a* b a*)* 
+3

Stavo scrivendo qualcosa di simile :) Per elaborare, questa regex individua tutte le stringhe con un numero dispari di a (prima sezione) e OR quelle stringhe con qualsiasi stringa contenente un numero dispari di b. C'è un piccolo errore qui, però, poiché il primo termine ha bisogno di b * alla fine e la seconda opzione ha bisogno di un * alla fine. Altrimenti, abbba non sarà accettato. –

+0

@ sepp2k, questo funziona in tutti i miei casi di test. Puoi descrivere il tuo processo mentale mentre lo facevi? È molto più semplice del percorso che stavo scendendo. – mmcdole

+0

Nessuno ha detto che non può essere ambiguo. Walt è corretto, non è finito, ma tutti i bit importanti ci sono. :) –

0

Penso che sia necessario affrontare il problema in modo diverso.

Si sta tentando di abbinare qualsiasi cosa che non ha numeri pari di entrambi a e b.

Probabilmente sarebbe più facile iniziare con qualcosa che corrisponde anche numero di a e b. Tutto quello che devi fare a quel punto sarebbe aggiungere qualcosa alla fine che corrisponda alla stringa più piccola che vuoi effettivamente abbinare.

Problemi correlati