2012-12-27 16 views
5

Quindi la mia azienda utilizza una terza parte per i loro siti mobili e abbiamo una console per aggiornare parte del codice e controllare le cose attraverso di loro. Una delle cose è una funzione di ricerca e sostituzione che può aggiornare il codice per il sito. L'unica cosa è che usa un sacco di codice regex complesso e non riesco a trovare un buon tutorial sulle cose complesse. Così qui è l'esempio che mi ha dato che si attacca afferra il tag di paragrafo e lo mette nel linkCerca e sostituisci con Regex con le variabili sostitutive

Ricerca

(#d6d6d4.+?>.+?<p><a.+?>.+?)</a>(.+?)</td> 

Sostituire Con

$1$2</a></td> 

Qual è il $ 1 e $ 2 che rappresentano? So che probabilmente ha qualcosa a che fare con uno dei. +? ma non sono sicuro quale. Se qualcuno lo sa, per favore aiutami. Ho aggiunto il codice in basso con i numeri accanto alle variabili regex

(#d6d6d4.+?**[1]**>.+?**[2]**<p><a.+?**[3]**>.+?**[4]**)</a>(.+?**[5]**)</td> 

risposta

14

I $ 1 e $ 2 rappresentano il testo nel catturare i gruppi nella regex. Catturare gruppi sono ciò che è racchiuso tra parentesi.

(  // start first capture group 
#d6d6d4 // match #d6d6d4 
.+?>  // any character, non-greedy, up to '>' 
.+?<p> // any character, non-greedy, up to <p> 
<a.+?> // an <a..> tag, consuming everything up to '>' 
.+?  // all characters from <a> to </a> 
)  // close the first capture group before the '</a>' 
</a>  // literal '</a>' 
(  // start second capture group 
.+?  // match all, non-greedy up to '</td>' 
)  // close capture group before '</td>' 
</td> // literal '</td>' 

modo che se si dispone di questa stringa: <td color=#d6d6d4 foo=bar>Hello, world<p><a href=http://foo.com>foo link</a>some more text</td>

$ 1 corrispondenze: #d6d6d4 foo=bar>Hello, world<p><a href=http://foo.com>foo link $ 2 partite: some more text

Così la stringa si trasforma in: <td color=#d6d6d4 foo=bar>Hello, world<p><a href=http://foo.com>foo linksome more text</a></td>

Il che significa fondamentalmente la Il tag </a> viene spostato dopo some more text (o immediatamente prima dello </td> se preferisci)

+2

Grazie, questo è stato di grande aiuto, vedere $ 1 che non sapevo fosse un gruppo di acquisizione, quindi è un grande aiuto! Grazie! – user1566783

1

considero http://rubular.com/ ad essere un grande strumento di formazione per regex di perché è interattivo e si può mantenere provare diversi modelli contro un testo diverso e si vedono i risultati subito.

Include un collegamento a http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html#UJ che è una buona guida di base per le espressioni regolari.

C'è anche http://www.regular-expressions.info/

Perché lottare per scrivere il vostro proprio quando c'è anche un luogo per 3,500+ librerie regex a http://regexlib.com

Le variabili $ vengono utilizzate per memorizzare 'del match che sono fatte: - $ 1 per la prima partita; $ 2 per il secondo, ecc.

+0

Ok, vedo dove $ 2 viene popolato lì alla fine, ma dove $ 1 ricevo le informazioni – user1566783

+0

Grazie per questi siti, mi piace l'app reggy per i test. http://reggyapp.com/ – DogCoffee

4

le variabili $ 1 e $ 2 sono le partite catturate per i paterni all'interno (parentesi) $ 1 è il primo gruppo paren e $ 2 è il secondo.

+0

Ok quindi $ 2 sta afferrando l'ultimo tra i tag di chiusura, ma poi $ 1 ha afferrato tutto ciò che è giusto dopo l'apertura di un tag? – user1566783

+0

Questo è corretto. – Barmar

+0

Ok, ma credo che sia quello che mi confonde da perché non sarebbe quello giusto prima del tag del paragrafo? – user1566783