Espressioni regolari

Messaggioda Lawlietz » 04/06/2019, 13:00

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
Ultima modifica di Lawlietz il 05/06/2019, 16:06, modificato 1 volta in totale.
Lawlietz
New Member
New Member
 
Messaggio: 24 di 58
Iscritto il: 27/04/2018, 22:24

Re: Espressioni regolari

Messaggioda apatriarca » 04/06/2019, 14:23

La regex \([^)]*\)|\w+ potrebbe fare al caso tuo.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5224 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Espressioni regolari

Messaggioda Lawlietz » 05/06/2019, 15:33

Mille grazie! Mi sei stato molto d'aiuto
Lawlietz
New Member
New Member
 
Messaggio: 25 di 58
Iscritto il: 27/04/2018, 22:24

Re: Espressioni regolari

Messaggioda Lawlietz » 11/06/2019, 17:39

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!
Lawlietz
New Member
New Member
 
Messaggio: 26 di 58
Iscritto il: 27/04/2018, 22:24

Re: Espressioni regolari

Messaggioda apatriarca » 11/06/2019, 17:56

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.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5229 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Espressioni regolari

Messaggioda Lawlietz » 11/06/2019, 20:17

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 :/
Lawlietz
New Member
New Member
 
Messaggio: 27 di 58
Iscritto il: 27/04/2018, 22:24

Re: Espressioni regolari

Messaggioda apatriarca » 11/06/2019, 20:36

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.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5231 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Espressioni regolari

Messaggioda Lawlietz » 12/06/2019, 15:55

Capisco, allora penserò ad una alternativa.
Anche solo per "cultura" , con le regex non c'è proprio modo di farlo senza ricorrere?
Lawlietz
New Member
New Member
 
Messaggio: 28 di 58
Iscritto il: 27/04/2018, 22:24

Re: Espressioni regolari

Messaggioda tetravalenza » 13/06/2019, 15:43

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
tetravalenza
Junior Member
Junior Member
 
Messaggio: 31 di 329
Iscritto il: 29/03/2019, 14:35


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite