# Tree matching con Oniguruma e Regexp in ruby 1.9 ("Tanaka Akira special")

**URL:** <https://www.ruby-forum.com/t/tree-matching-con-oniguruma-e-regexp-in-ruby-1-9-tanaka-akira-special/217133>\
**Category:** IT\
**Created:** [February 22, 2012, 9:32am UTC](https://www.ruby-forum.com/t/tree-matching-con-oniguruma-e-regexp-in-ruby-1-9-tanaka-akira-special/217133 "2012-02-22T09:32:06Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![luislavena](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/0ea827/32.png) [@luislavena](https://www.ruby-forum.com/u/luislavena)\
**Post date:** [February 22, 2012, 9:32am UTC](https://www.ruby-forum.com/t/tree-matching-con-oniguruma-e-regexp-in-ruby-1-9-tanaka-akira-special/217133/1 "2012-02-22T09:32:06Z")

</div>

Eil,

In seguito ad una ennesima discussione su cosa siano le espressioni  
regolari, e come le regexp al giorno d’oggi siano in realt turing  
complete o robe cos, mi son trovato a scrivere una regex che  
matchasse la sintassi delle s-expression in lisp.

Che pi o meno, viene una cosa cos:

r = %r@  
(? \w+){0}  
(? '\g){0}  
(?  
\g |  
\g |  
(  
\g  
(? (\s+ \g)\* )  
)  
){0}  
^\g$  
@ix

Il problema che mentre questa cosa funziona[0] come validazione (nel  
senso che correttamente risconosce una sexpr e una cosa invalida) non  
genera un albero dei match, perch ogni match di una sotto-espressione  
sovrascrive l’ultimo named group.

Che poi probabilmente lo stesso anche con i gruppi numerati, e.g.

/((a|b)\*)/.match(‘aaa’) =\> #\<MatchData “aaa” 1:“aaa” 2:“a”\>

mi perde il riferimento al match della prima “a” e della prima “b”.

Per a giudicare dalle API di oniguruma si dovrebbe poter infilare una  
callback per ogni accesso ricorsivo.  
Solo, mi pare che in ruby non ci sia. Qualcuno ha una vaga idea di  
cosa io stia parlando, e se esiste un workaround che non sia “scrivi  
ffi-oniguruma”[1]?

[0] per qualche valore di “funziona”  
[1] astenersi “le regex non sono adatte usa un parser generator”, Il  
problema “le regex in ruby 1.9” non “il parsing” 🙂

–  
twitter: @riffraff  
blog (en, it): www.riffraff.info [riffraff.blogsome.com](http://riffraff.blogsome.com)  
work: [cascaad.com](http://cascaad.com) [circleme.com](http://circleme.com)

---

<div class="post-metadata">

**Author:** ![gabriele\_renzi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e19b73/32.png) [@gabriele\_renzi](https://www.ruby-forum.com/u/gabriele_renzi)\
**Post date:** [February 22, 2012, 10:26am UTC](https://www.ruby-forum.com/t/tree-matching-con-oniguruma-e-regexp-in-ruby-1-9-tanaka-akira-special/217133/2 "2012-02-22T10:26:03Z")

</div>

Il giorno 22 febbraio 2012 09:30, gabriele renzi [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
scritto:

> r = %r@  
> ^\g$  
> /((a|b)\*)/.match(‘aaa’) =\> #\<MatchData “aaa” 1:“aaa” 2:“a”\>  
> [0] per qualche valore di “funziona”  
> [1] astenersi “le regex non sono adatte usa un parser generator”, Il  
> problema “le regex in ruby 1.9” non “il parsing” 🙂

\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* (sono stato censurato per via del motivo  
[1]).

---

<div class="post-metadata">

**Author:** ![gabriele\_renzi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e19b73/32.png) [@gabriele\_renzi](https://www.ruby-forum.com/u/gabriele_renzi)\
**Post date:** [February 22, 2012, 11:53am UTC](https://www.ruby-forum.com/t/tree-matching-con-oniguruma-e-regexp-in-ruby-1-9-tanaka-akira-special/217133/3 "2012-02-22T11:53:21Z")

</div>

Non saprei cosa rispondere se non che sarebbe molto bello fare questo  
genere di cose con una regexp, personalmente mi farebbe risparmiare un  
sacco di tempo, peccato che raramente riesco ad ottenere il risultato  
sperato, ad esempio:

“”.match(/(\<\w+\>)+/)  
=\> #\<MatchData “” 1:""\>

non dovrebbe estrarre anche ?

---

<div class="post-metadata">

**Author:** ![gabriele\_renzi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e19b73/32.png) [@gabriele\_renzi](https://www.ruby-forum.com/u/gabriele_renzi)\
**Post date:** [February 22, 2012, 1:32pm UTC](https://www.ruby-forum.com/t/tree-matching-con-oniguruma-e-regexp-in-ruby-1-9-tanaka-akira-special/217133/4 "2012-02-22T13:32:12Z")

</div>

2012/2/22 Marco M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Non saprei cosa rispondere se non che sarebbe molto bello fare questo  
> genere di cose con una regexp, personalmente mi farebbe risparmiare un  
> sacco di tempo, peccato che raramente riesco ad ottenere il risultato  
> sperato, ad esempio:
> 
> “”.match(/(\<\w+\>)+/)  
> =\> #\<MatchData “” 1:“”\>
> 
> non dovrebbe estrarre anche ?

gi, sembra essere la stessa situazione: i buffer dei risultati sono  
fissati quando viene compilata la regexp e vengono riutilizzati sempre  
quelli.

Nel tuo caso specifico te la puoi cavare con scan:

“”.scan(/\<\w+\>/)

Una cosa curiosa che ho scoperto che puoi avere n volte lo stesso  
named group per (anche se non puoi accederci in modo sensato):

> > m=‘abc’.match(/(? a)(? b)(? c)/x)  
> > =\> #\<MatchData “abc” lett:“a” lett:“b” lett:“c”\>  
> > m[:lett]  
> > =\> “c”  
> > m.captures  
> > =\> [“a”, “b”, “c”]

–  
twitter: @riffraff  
blog (en, it): www.riffraff.info [riffraff.blogsome.com](http://riffraff.blogsome.com)  
work: [cascaad.com](http://cascaad.com) [circleme.com](http://circleme.com)

---

<div class="post-metadata">

**Author:** ![gabriele\_renzi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e19b73/32.png) [@gabriele\_renzi](https://www.ruby-forum.com/u/gabriele_renzi)\
**Post date:** [February 24, 2012, 8:47am UTC](https://www.ruby-forum.com/t/tree-matching-con-oniguruma-e-regexp-in-ruby-1-9-tanaka-akira-special/217133/5 "2012-02-24T08:47:33Z")

</div>

mi rispondo da solo (e quindi mi perdono il top posting):

non si pu fare, ed una limitazione che c’ apparentemente in tutti  
i regexp engine in giro, anche se c’ un mezzo workaround usando PCRE  
in C ☹

2012/2/22 gabriele renzi [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> r = %r@  
> ^\g$  
> /((a|b)\*)/.match(‘aaa’) =\> #\<MatchData “aaa” 1:“aaa” 2:“a”\>  
> [0] per qualche valore di “funziona”  
> [1] astenersi “le regex non sono adatte usa un parser generator”, Il  
> problema “le regex in ruby 1.9” non “il parsing” 🙂
> 
> –  
> twitter: @riffraff  
> blog (en, it): www.riffraff.info [riffraff.blogsome.com](http://riffraff.blogsome.com)  
> work: [cascaad.com](http://cascaad.com) [circleme.com](http://circleme.com)

–  
twitter: @riffraff  
blog (en, it): www.riffraff.info [riffraff.blogsome.com](http://riffraff.blogsome.com)  
work: [cascaad.com](http://cascaad.com) [circleme.com](http://circleme.com)

---

<div class="post-metadata">

**Author:** ![gabriele\_renzi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e19b73/32.png) [@gabriele\_renzi](https://www.ruby-forum.com/u/gabriele_renzi)\
**Post date:** [March 14, 2012, 8:11pm UTC](https://www.ruby-forum.com/t/tree-matching-con-oniguruma-e-regexp-in-ruby-1-9-tanaka-akira-special/217133/6 "2012-03-14T20:11:37Z")

</div>

2012/3/14 Marco M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Ciao Gabriele, dove hai trovato quella sintassi per referenziare le  
> occorrenze ?\<\>  
> In ruby 1.8.7 non funziona e volevo capire se per una questione di  
> sintassi diversa

ruby 1.9 ha un motore diverso (basato su oniguruma) quindi normale  
che non ti funzioni con 1.8.

Poi nel frattempo, da quel che ho capito, lo sviluppatore di oniguruma  
ha litigato con matz e ha abbandonato lo sviluppo, e adesso c’ un  
fork (onigmo) che ha backport dei fix che c’erano in ruby, e che la  
cosa che viene importata in ruby-head.

Grossomodo la sintassi sta qua, comunque

> <https://github.com/k-takata/Onigmo/blob/master/doc/RE>

–  
twitter: @riffraff  
blog (en, it): www.riffraff.info [riffraff.blogsome.com](http://riffraff.blogsome.com)  
work: [cascaad.com](http://cascaad.com) [circleme.com](http://circleme.com)

---

<div class="post-metadata">

**Author:** ![gabriele\_renzi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e19b73/32.png) [@gabriele\_renzi](https://www.ruby-forum.com/u/gabriele_renzi)\
**Post date:** [March 15, 2012, 4:51pm UTC](https://www.ruby-forum.com/t/tree-matching-con-oniguruma-e-regexp-in-ruby-1-9-tanaka-akira-special/217133/7 "2012-03-15T16:51:02Z")

</div>

Avevo formulato male la domanda, mi interessava sapere se c’era un modo  
per farlo anche col vecchio motore usato nell’1.8 o se era una  
prerogativa del nuovo.

Grazie per la risposta e per il link.

---

<div class="post-metadata">

**Author:** ![gabriele\_renzi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e19b73/32.png) [@gabriele\_renzi](https://www.ruby-forum.com/u/gabriele_renzi)\
**Post date:** [March 15, 2012, 6:15pm UTC](https://www.ruby-forum.com/t/tree-matching-con-oniguruma-e-regexp-in-ruby-1-9-tanaka-akira-special/217133/8 "2012-03-15T18:15:16Z")

</div>

2012/3/15 Marco M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Avevo formulato male la domanda, mi interessava sapere se c’era un modo  
> per farlo anche col vecchio motore usato nell’1.8 o se era una  
> prerogativa del nuovo.

dunque, la stessa cosa no non si pu.  
Puoi “parsare” delle cose un po’ articolate anche col motore vecchio  
(e.g. ABNF.rb una figata, converte automaticamente da un subset di  
ABNF a Regexp[1]) ma folle farlo 🙂

[1] [abnf - converter from ABNF to Regexp](http://www.a-k-r.org/abnf/)

–  
twitter: @riffraff  
blog (en, it): www.riffraff.info [riffraff.blogsome.com](http://riffraff.blogsome.com)  
work: [cascaad.com](http://cascaad.com) [circleme.com](http://circleme.com)

---

<div class="post-metadata">

**Author:** ![gabriele\_renzi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e19b73/32.png) [@gabriele\_renzi](https://www.ruby-forum.com/u/gabriele_renzi)\
**Post date:** [March 14, 2012, 10:36am UTC](https://www.ruby-forum.com/t/tree-matching-con-oniguruma-e-regexp-in-ruby-1-9-tanaka-akira-special/217133/9 "2012-03-14T10:36:45Z")

</div>

Ciao Gabriele, dove hai trovato quella sintassi per referenziare le  
occorrenze ?\<\>  
In ruby 1.8.7 non funziona e volevo capire se per una questione di  
sintassi diversa
