Pagina 1 di 1

Espressioni regolari

MessaggioInviato: 04/06/2019, 13:00
da Lawlietz
Buon giorno a tutti,
scrivo questo post per chiedervi aiuto a scrivere un'espressione regolare che mi permetta di raggruppare un numero di stringhe arbitrario separate da spazio o racchiuse da parentesi e inserirle in un vector. Mi spiego meglio:
data una stringa costituita da caratteri alfanumerici e parentesi come questa

" Sei proprio tu John Wayne ( E io chi sarei ) "

desiderei fare in modo che venisse splittata come segue :

Sei
proprio
tu
John
Wayne
(E io chi sarei)

ossia in base allo spazio meno che nel caso in cui incontri un' espressione racchiusa da parentesi che in quel caso deve essere presa integralmente.
Grazie in anticipo a chi mi aiuterà :D

Re: Espressioni regolari

MessaggioInviato: 04/06/2019, 14:23
da apatriarca
La regex \([^)]*\)|\w+ potrebbe fare al caso tuo.

Re: Espressioni regolari

MessaggioInviato: 05/06/2019, 15:33
da Lawlietz
Mille grazie! Mi sei stato molto d'aiuto

Re: Espressioni regolari

MessaggioInviato: 11/06/2019, 17:39
da Lawlietz
Buona sera,
riapro questo post poichè ho trovato un bug in fase di testing in una parte di codice che avevo scritto utilizzando questa regex.
Infatti, quando ho posto l'esempio forse ne ho scelto uno sbagliato che non teneva conto di espressioni con parentesi multiple. Chiedo allora di nuovo un suggerimento provando a riformulare :
deve splittare in presenza di spazi o in presenza di parentesi ma ignorando le parentesi interne ad un blocco di altre.
Nell'esempio che feci settimana scorsa, se avessi
"Sei proprio tu John Wayne ( E (io) chi sarei ) "
vorrei ottenere

Sei
proprio
tu
John
Wayne
(E (io) chi sarei)

e Idem se avessi dentro le parentesi più esterne n paia di altre parentesi.
Grazie mille in anticipo a chiunque spenderà il suo tempo a rispondermi!

Re: Espressioni regolari

MessaggioInviato: 11/06/2019, 17:56
da apatriarca
Qual'è il vero problema che stai cercando di risolvere? Ti è stato richiesto di usare le espressioni regolari o è semplicemente lo strumento che hai deciso fosse più adatto al tuo problema?

Riconoscere un insieme di parentesi bilanciate è un esempio classico di linguaggio che dipende dal contesto. Le espressioni regolari di base non sono in grado di trattare questo tipo di linguaggi, ma esistono estensioni abbastanza diffuse che lo permettono. A seconda della situazione in cui vuoi usare questa espressione regolare, la seguente soluzione potrebbe funzionare o meno: \((?>[^()]|(?R))*\)|\w+

P.S. Non so se hai notato in precedenza che le regex che ho inserito sono in realtà dei link a un sito che permette di provarle e comprenderle meglio.

Re: Espressioni regolari

MessaggioInviato: 11/06/2019, 20:17
da Lawlietz
Anzitutto grazie mille per avermi risposto =D.
Il problema che sto cercando di risolvere è il seguente (lo descrivo molto brevemente perchè quello che ho chiesto qui è solo una piccola parte):
ho un sistema idraulico fatto da componenti che eseguono una specifica operazione sui flussi (tubi a T che lo dividono, tubi a T che lo dividono in 2/3 e 1/3, tubi normali che lo lasciano passare invariato, ecc) e quindi ho delle classi per i componenti ed una per il sistema idraulico (che è un grafo). La descrizione mi è data nella forma di operazioni tra sorgenti e componenti ove le parentesi sono usate per dare una qualche priorità (altrimenti ha priorità chi sta a sx). Esempio

sorgente1 tubo a T (sorgente2 tubonormale sorgente3) ecc
Sono naturalmente richieste varie cose che però esulano dalla mia domanda.
Vista la formulazione della descrizione del sistema, a me è venuto naturale pensare di scrivere un metodo che crea gli archi lavorando con "espressioni fuori dalle parentesi" e ricorrere qualora mi imbattessi in una in parentesi, che è ciò che farei se avessi qualcosa che ci somiglia vagamente come un'espressione algebrica elementare . Ad esempio

$a + b + ( c - ( c + d*a ))/e $


ove ho degli operatori (+,-,*,/)che fanno una qualche elaborazione dei dati e delle priorità. Quindi svolgo prima la somma fuori, poi la parentesi e ciò che ottengo lo sommo a quanto ottenuto in precedenza e via così.
In sintesi, farei come se dovessi esplorare un albero con operandi e operatori per foglie (se mi passate il paragone).
Per far tutto ciò avevo bisogno di splittare per come ho descritto nei precedenti messaggi. Se, però, trovate questo approccio errato, o "non un granchè" accetto volentieri dei suggerimenti.Grazie in anticipo.

p.s. il linguaggio è C++ e quella regex che funziona a meraviglia sul simulatore che mi hai linkato, non viene eseguita perchè ricorre :/

Re: Espressioni regolari

MessaggioInviato: 11/06/2019, 20:36
da apatriarca
Dipende molto dalla particolare libreria utilizzata. Vuoi in pratica costruire un parser per delle espressioni. Le regex non sono pensate per risolvere questo tipo di problemi. A seconda della complessità del tuo linguaggio, implementare un Recursive descent parser o lo Shunting-yard algorithm potrebbe essere abbastanza semplice. In alternativa ci sono programmi per generare un parser a partire da una grammatica o librerie come boost spirit.

Re: Espressioni regolari

MessaggioInviato: 12/06/2019, 15:55
da Lawlietz
Capisco, allora penserò ad una alternativa.
Anche solo per "cultura" , con le regex non c'è proprio modo di farlo senza ricorrere?

Re: Espressioni regolari

MessaggioInviato: 13/06/2019, 15:43
da tetravalenza
Ciao, è possibile partendo da questa espressione regolare

Codice:
([[:lower:]][[:upper:]]){2,}


far sì che prenda parole che contengono lettere maiuscole/minuscole che si alternano? Per esempio

Codice:
giAcCone
aRmAdIo


ma non
Codice:
ciao
mondo