Problema regex

di il
2 risposte

Problema regex

Ciao a tutti, ho la seguente stringa:

"funzione(arg1, arg2) testo casuale $( ...qualcosa... ) altro testo $( $( $( ...qualcosa... ) ...qualcos'altro... ) qualcos'altro ancora)"

mi servirebbe una regex che mi permette, ricorsivamente, di selezionare solamente le sottostringhe comprese tra 2 parentesi tonde di cui la prima parentesi è preceduta dal carattere speciale $.
In altre parole, vorrei che la regex estraesse solamente le sottostringhe:
"$( $( $( ...qualcosa... ) ...qualcos'altro... ) qualcos'altro ancora)" e "$( ...qualcosa... )"
ma non consideri la sottostringa:
"(arg1, arg2)"

Al momento, sono arrivato al punto in cui utilizzando la regex "\((?>[^()]|(?0))*\)" riesco ad estrarre tutto ciò che è compreso tra 2 parentesi tonde, però, non riesco a trovare un modo per escludere i casi in cui la prima parentesi tonda non è preceduta dal carattere speciale $

Grazie in anticipo per l'aiuto

2 Risposte

  • Re: Problema regex

    Al limite potresti intervenire programmaticamente controllando quando la prima parentesi tonda non è preceduta dal $
  • Re: Problema regex

    stranger1902 ha scritto:


    mi servirebbe una regex che mi permette, ricorsivamente, di selezionare solamente le sottostringhe comprese tra 2 parentesi tonde di cui la prima parentesi è preceduta dal carattere speciale $.
    In altre parole, vorrei che la regex estraesse solamente le sottostringhe:
    "$( $( $( ...qualcosa... ) ...qualcos'altro... ) qualcos'altro ancora)" e "$( ...qualcosa... )"
    La questione che vedo io è che la forma $( ..... ) può essere "annidata". Gestire questo con le regex è molto complesso (se non impossibile). Le regex non hanno alcun supporto implicito per questo, né "sanno" certamente contare i livelli di annidamento delle occorrenze.

    La soluzione probabilmente migliore sarebbe analizzare la stringa usando il concetto classico di "stack". Basta andare avanti a cercare solo 2 cose: "$(" oppure ")" (e non servirebbero nemmeno le regex per questo). Quando trovi "$(" incrementi una variabile di livello, quando incontri ")" la decrementi.
    "bla $(esempio) bla $(ciao $(prova) ciao)"
     00001111111111000001111111222222221111110
    Ora: puoi decidere pure se considerare e prendere solo le sottostringhe a livello 1 (quindi solo "$(esempio)" e "$(ciao $(prova) ciao)" oppure catturare anche le sottostringhe ai livelli più interni (anche "$(prova)"). A tua scelta ....
Devi accedere o registrarti per scrivere nel forum
2 risposte