Newsgroup: it.comp.programmare
Titolo: REGEX ostica (per me)

se stabilisco questa regex
\b(\w)(\w)\w\2\1\b
data una serie di parole trovo tutti i palindromi a cinque lettere.
Funziona ma non riesco a capire come :(
qualcuno mi può chiarire?
ciao

 qualcuno mi può chiarire?
Quale pezzo non capisci? Ci sono 4 elementi nella regex:
\b è il confine di una parola;
\w è un carattere interno, [a-zA-Z0-9_];
( e ) servono a raggruppare;
\1 e \2 si riferiscono ai gruppi che sono già stati scritti.

Le regex sono standard, ovvero uguali su tutti i sistemi che le supportano?
C'e' qualche guida completa su internet da usare sia per apprenderle che 
come reference? 

 come reference?
A iosa, usa un qualsiasi Google a caso.

 come reference?
E lo chiedi?
To' parti da qua, per esempio.
http://www.regular-expressions.info/reference.html
E per lo studio e le tue prove dotati di un sed o di un grep per
mettere in pratica.
(Ma come hai fatto a vivere senza fino ad oggi?)

 (Ma come hai fatto a vivere senza fino ad oggi?)
Non lavoro molto con le stringhe, e in genere mi scrivo qualche funzione che 
parsa la stringa e verifica se soddisfa i requisiti che mi interessano. 

Parli di finester? :-P
No, sta facendo una confusa generalizzazione ideologica.
In ambiente posix ci sono almeno due implementazioni autorevoli di
espressioni regolari, con sostanziali differenze fra di loro. Per contro,
in ambiente Windows, le differenze fra le regex di (per esempio) JScript e
quelle di Perl (una delle implementazioni autorevoli di cui sopra) sono
abbastanza esotiche da poter essere ignorate nella stragrande maggioranza
dei casi. I "porting", poi (PCRE, per esempio), tendono ovviamente a
comportarsi in modo sostanzialmente uguale all'implementazione d'origine.
La verit� � che, come ti hanno giustamente detto, esistono diversi "gusti"
di regex, e questo � tutto quello che si pu� dire.
Ciao.

 Quale pezzo non capisci?
Allora se scrivo: \b(\w)(\w)\2\1\b sto a significare: trova le
corrispondenze del gruppo di caratteri (\w) poi (attraverso una
backreference) ritorna e trova le corrispondenze partendo dalla fine
delle parole trovate (\b indica il bordo di parola) indicate con  \2 e
con \1; se le corrispondenze coincidono la parola trovata è palindroma
di 4 lettere.
1. non capisco come si stabilisce proprio 4 lettere e non 5 o più.
2. parallelamente -- riferendomi alla regex oggetto del thread -- non
capisco quel \w che appare prima delle istruzioni backreference: \b(\w)
(\w)  \w  \2\1\b: questa trova i palindromi di 5 lettere.
Spero di essere stato chiaro.
ciao

 ciao
(\w) significa:
()  -- > gruppo   di   \w  -->  UN carattere
quindi:
\b\w\w\w\w\b  ----->  parola di QUATTRO caratteri
e poi:
\b(\w)(\w)\2\1\b   -----> parola di:
                          2 caratteri, poi il secondo gruppo,
                                       poi il primo gruppo
 
essendo primo e secondo gruppo un carattere ottengo una parola d 4
caratteri.
-- 
Stefano L.

 (\w)  \w  \2\1\b: questa trova i palindromi di 5 lettere.
Scusa ma hai presente come è scritto un palindromo e che il numero 5 è 
dispari? Il terzo carattere è il centro della simmetria e non ha bisogno 
di essere ripetuto con un backreference.

 Spero di essere stato chiaro.
Le parentesi tonde intorno ad una espressione hanno come effetto di
memorizzare il risultato in una variabile numerata progressivamente: /
1 /2 /3 ...
Per altri dubbi o domande, siamo qua.
P.S. Le RE nuocciono gravemente alla cattiva programmazione. Una volta
apprese, causano una elevata assuefazione, con conseguente rigetto per
tutti quegli ambienti in cui non si possono usare.

 qualcuno mi pu� chiarire?
Ho trovato questa guida per principianti, secondo me molto chiara:
http://fido.altervista.org/RegExp/regex.html
A questo punto vediamo se ho capito qualcosa di quello che ho letto :-P
Le \b che si trovano all'inizio e alla fine servono a considerare solo le 
stringhe che non sono sottostringhe di altre
il primo, il secondo ed il terzo \w indica un qualunque carattere 
alfanumerico, per� nei primi due ci sono le parentesi.
In tal modo il valore incontrato (matchato o che fa match e' troppo brutto!) 
dal primo (\w) lo puoi recuperare tramite \1 mentre il valore incontrato dal 
secondo (\w) lo recuperi tramite \2. Il terzo non ha parentesi perch� non ci 
interessa che sia uguale a qualche altra lettera, essendo il valore 
centrale.
Quindi quella regex riesce ad esempio a considerare valida la stringa ABCBA 
perch�:
1. Non � una sottostringa (le \b vietano di considerare valide le 
sottostringhe)
2. La prima A viene rilevata dal primo (\w)
3. La prima B viene rilevata dal secondo (\w)
4. La C viene rilevata dal \w che non ha parentesi perch� non dobbiamo 
richiamarlo con \numero
5. La seconda B non � altro che la prima B che richiamiamo con \2
6. La seconda A non � altro che la prima A che richiamiamo con \1 

Molte grazie per le risposte!
Io per le prove utilizzo "The Regex Coach" (s.o. windows).
Domanda OT: quale linguaggio NON supporta le regex?
ciao