Si può usare una espressione regolare per trovare le parentesi di chiusura in un HTML?

Quando finii di leggere questa risposta avevo le lacrime agli occhi

Gesù!

Se tutto quello che hai è un martello, usalo pure per tagliare un tronco.
Tuttavia il tempo che impiegherai per farlo ti basterebbe per andare a comperare un attrezzo idoneo, fare il lavoro meglio e, probabilmente, berti una meritata birra.

Cioè bello sì.
Ma molto più interessante e costruttiva la discussione sulle grammatiche formali.
SO ha miseramente fallito, in questo caso.

Lì dichiaro ignoranza.
Mi fermavo a
“Anche io uso one-liners, script bash e python in modo assurdo per soluzioni quick and dirty”
ma almeno me ne rendo conto delle porcate che sto facendo…

Se poi uno vuole scrivere in regex un’intero pacchetto parser XML faccia pure, ma ottiene la stessa complessità che esiste già con altri parser e, probabilmente, parecchi grattacapi in più.

Non so, non posso certo dirmi il maggiore esperto di questi temi, anche se sono abbastanza parte del mio pane quotidiano.

Cioè, volete dire che non avete riso come pazzi al codice dell’orrore?? Le terribili conseguenze di invocare le espressioni regolari che ti fanno liquefare gli occhi? L’uso genuinamente creativo dell’ ASCII?
Siete degli insensibili!

Cmq, vero costruire un intero parser tramite espressioni regolari è una perdita di tempo (beh almeno ho studiato un poco) soprattutto se si parla di strutture senza contesto. Io dovevo estrarre qualche valore e qualche sotto struttura (e qui l’inghippo) da un JSON, e sapendo in anticipo la struttura era più semplice un Perl regex che seguire tutta la grammatica del parser

…'spetta: HTML/XML o JSON?

In entrambi i casi, per soluzioni “scripting” di prova/spulciamento, io di solito lancio un pitone e uso le librerie interne.

Ma, ripeto, di formazione non sono un informatico e di lavoro faccio data management/standardizzazione, non sviluppo codice.

Personalmente mi toccava un JSON, ma il principio era identico: raccogliere una struttura tra parentesi. Se quella iniziale era ovvia, non tanto lo era la.corrispondente di chiusura. E mi sono imbattuto in quella risposta.

Ancora vedo mostruosità appena provo a formulare certi regex!

Regex non ha la capacità di gestire la ricorsività, json e xml sono strutture che la prevedono espressamente quindi regex da sola non è in grado di interpretarle.
Questa la spiegazione in parole poverissime del pippone sulle grammatiche di tipo 2 e tipo 3.

In realtà il Perl ce la farebbe a gestire la ricorsione, ma anche io penso agli one liner, quindi hanno flessibilità estremamente limitata.

Questo, immagino

Sì, notevole
:smile:

Era il post iniziale!

Io avevo le lacrime agli occhi

Vabbè il tipo non sa cosa scrive, no?

I believe it says:

  • Find a less-than, then
  • Find (and capture) a-z one or more times, then
  • Find zero or more spaces, then
  • Find any character zero or more times, greedy, except /, then
  • Find a greater-than

Comunque il mio fido parser di RegEx sentenzia questo:

Ovviamente non fa quello che il tipo vorrebbe, cioè col piffero che becca i “<” (less than) o i “>” (greater than) e col piffero che trova quello che vuole in un Html che può essere scritto, volendo, tutto su una riga sola (e altre belle cose che gli cambiano il dom a posteriori).

/-------------------------
edit:
aspetta, forse sì. Devo provarla un giorno.
/-------------------------

Che poi, cosa crede di volere? Ogni riga che non contiene un “/” ma che cominci per “<” e finisca per “>” avendo in mezzo praticamente qualsiasi carattere (eccetto numeri e speciali, ma includendo doppi apici (e non sa che può avere anche i singoli) ? S’illude che l’ html sia scritto riga per riga, una istruzione alla volta, semplice e lineare, con acapo tutti al posto giusto, immagino. E si illude anche sulla regEx stessa.

/-------------

Edit:

Mah. E se avesse ragione lui? Dico, se l’Html è il suo ed è scritto in modo molto semplice, magari gli funziona anche

/-------------

A dire il vero con il Perl si può fare una cattura multi linea con una ricorsività tale da fermarsi alla.parentesi di chiusura corrispondente. Io alla fine ho usato quello ma su due piedi non ricordo. Se vuoi te lo cerco

Anche no - le mie conoscenze di regex si fermano a Expresso.

Una volta mi è toccato usarle per qualche periodo in modo intensivo e mi ero messo a studiarle un poco - di base non mi funzionava niente. Che poi: ottime per il parsing di testi, ma poi scopri di avere due problemi:

  1. il parsing dei testi
  2. l’espressione regolare
    (okay, è una battuta evergreen)

Comunque: le uso sporadicamente, molto sporadicamente; ho dimenticato in 2 giorni il 90% di quello che ho studiato; non ne vedo una dal 2018.

Ricordo che, quando usavi quella giusta, facevi cose che col codice avrebbe richiesto enne chiamate ricorsive - infatti secondo me sono potentissime, ma anche una cosa davvero a parte. Conoscevo un Perlista che viveva di espressioni regolari. Siamo andati in un posto dove potevamo usare solo il dos o il vbscript e niente espressioni regolari. Alla fine, lui faceva l’analisi e io il programma in vbScript (parliamo di cose banali, niente di che: alla fine, si trattava di fare un login remoto e copiare dei file da enne cartelle diverse da remoto a nuova macchina - poi okay, c’erano altre cose da fare, ma questo era uno step fondamentale). Eravamo un team formidabile e abbiamo fatto n 20 giorni il lavoro che ad altri team ne aveva richiesto anche 80.
Il segreto? Niente espressioni regolari

(okay, lì in effetti non servivano. L’amico era in gamba, infatti poi è andato a lavorare da un’altra parte, dove servivano)

1 Mi Piace

Quello che fai con una espressione regolare complicata e illeggibile a volte lo puoi fare con più espressioni regolari semplici e un pezzetto di codice nativo.
Se devo fare il larsing dell’html, che senso ha usare regex se ci sono a disposizione libreria (tipo libxml2) che già fanno tutto?
Non comprendo francamente.

Penso che la questione, che spesso viene sollevata in questi forum.come sfide generiche o problemi teorici, sia quello dell’utente che si dice, perché importare tutta una libreria e studiarla? Dai proviamo così che sarà semplice… E scopre che semplice non è.
Ovviamente, dopo.

2 Mi Piace