Come apprendi le espressioni regolari? [chiuso]


80

Non sto chiedendo dove imparare. Ho trovato molte buone risorse online, libri ecc.

Ma come diamine posso affrontarli. Dov'è l'inizio, la fine? Quando il processore regexp avanza sul testo, quando mantiene la sua posizione e prova un'altra corrispondenza? eccetera.

Ho voglia di cercare di capire geroglifici sulle piramidi egiziane.


2
Sorta di argomento - regular-expressions.info . Usa questo e il suggerimento di @ Jalayn qui sotto. Impara facendo!
Freiheit,

6
gskinner.com/RegExr è lo strumento migliore per lo sviluppo di regex che ho trovato.
Callum Rogers,

Un po 'alla volta. Inizia con le cose semplici ("aaa", "aa.", "A * b", ecc.) E procedi fino a componenti specifici dell'implementazione (ad esempio PCRE). Quindi escogita uno schema e prova a creare una regex adatta.
Tylerl,

Ho imparato per tentativi ed errori con l'ottimo programma RegexBuddy. regexbuddy.com (Non ho credito per la pubblicità di questo, questo programma ha reso molto facile l'apprendimento)
Yam Marcovic,

rubular.com è un buon strumento per lo sviluppo di regex.
Gazler,

Risposte:


68

Penso che la conoscenza della teoria degli automi sia fondamentale per la comprensione.

Una volta capito cos'è un automa e come sono definite le lingue regolari, sarà molto più semplice comprendere le espressioni regolari .

Per quanto riguarda la sintassi specifica e le differenze tra le varie implementazioni ... Beh, alcune cose che devi solo ricordare. Ci sono aiuti anche per quello.

modificare

Alcuni dei commenti seguenti hanno sollevato punti importanti:

  1. Non dimenticare che le espressioni regolari (come implementate nella maggior parte dei linguaggi di programmazione) sono un superset di espressioni regolari nella teoria degli automi. Mentre un buon background teorico è un utile punto di partenza, non ti dirà tutto. (Grazie, David Thornley)

  2. Più commentatori affermano che è possibile apprendere le varie sintassi della regex senza apprendere le basi teoriche. Mentre è vero che puoi imparare la sintassi senza comprendere appieno come funziona, è stata la mia impressione che la piena comprensione sia ciò che l'OP stava cercando. La domanda riguardava la base effettiva: quando avanza il processore? Quando si ferma? Come decide che è una partita? Questa è la base, questa è la teoria ed è basata sulla teoria degli automi. Certo, puoi guidare un'auto senza sapere come funziona il motore. Ma se sei stato chiesto "come fa il gas effettivamente rendere Drive" - si deve parlare di come il motore è costruito, non è vero?


Commentatori: se vuoi discutere i punti più fini di questa domanda, utilizza la chat . Altrimenti, considera di lasciare una risposta o di votare le risposte che ritieni siano le più corrette.

Grazie per la modifica. Questo rende questa risposta molto più vicina alla verità. Anche se ancora non penso che tu abbia davvero bisogno di conoscere la teoria degli automi (non lo so, ma posso ancora scrivere espressioni regolari complesse), sono d'accordo sul fatto che una certa conoscenza della teoria possa aiutare. Soprattutto sapere come funziona il backtracking ed è controllato da quantificatori avidi / non golosi / possessivi può davvero aiutare la tua comprensione.
NikiC,

Solo i miei 2 centesimi: in una recente serie di video sulla libreria di regex C ++ STL nel canale 9 di MSDN, il presentatore, che è anche un manutentore di STL, ha detto che lo implementano come un autata. Quindi conoscere questa teoria dovrebbe davvero dare all'OP alcuni spunti su come funziona regex.
Korbes,

5
Non sono affatto d'accordo con la dichiarazione di apertura. Quando ho imparato le espressioni regolari non sapevo nulla della teoria degli automi. Tre decenni dopo ancora non lo faccio. Quello che sapevo era come leggere una pagina man, prenderla alla lettera e come sperimentare al prompt.
Bryan Oakley,

1
@Bryan bene ... La tua esperienza di tipo dimostra il punto. Forse sai come usarlo , ma non capisci davvero come funziona. Se lo fai, allora sai qualcosa sulla teoria degli automi, anche se non sai come chiamarlo. Ma non puoi comprendere appieno le espressioni regolari senza conoscere la teoria degli automi e nessuna quantità di pagine man di lettura può aiutarti lì (a meno che tu non stia leggendo pagine man che spiegano la teoria degli automi, ovviamente).
littleadv,

36

Praticando.

Ho imparato divertendomi con il web scraping. Sono sicuro che non ero il solo a farlo solo per divertimento.

Un esempio: scrivi del codice che recupera gli ultimi risultati di calcio, tennis (lo sport che ti piace di fatto) dal tuo sito Web sportivo preferito. Fallo scrivendo un po 'di codice per caricare la pagina, estrarre i punteggi con espressioni regolari e inviarli alla console o ad alcuni file di testo. Assicurati che con l'espressione regolare scegli di recuperare solo i punteggi e nient'altro. A volte questo può essere piuttosto impegnativo :-)

Secondo esempio: scrivi del codice che recupera l'immagine del tuo webcomic preferito (ad esempio mi piace molto Sinfest ) e che lo memorizza da qualche parte sul tuo disco rigido. Utilizzare solo espressioni regolari per recuperare il tag "img" e il suo contenuto. Facoltativamente, puoi anche recuperare il titolo se è archiviato da qualche parte.


15
L'analisi di HTML con espressioni regolari è generalmente una cattiva idea.
Max

10
Certo è una cattiva idea. L'uso di parser DOM / Sax o altri lettori XML dedicati è ciò che dovrebbe essere usato "in generale". Ma l'argomento qui riguarda l'apprendimento delle espressioni regolari e ho condiviso il modo in cui ho appreso sulle espressioni regolari in quello che pensavo fosse un modo "divertente".
Jalayn,

3
L'uso dei parser XML per le pagine Web HTML è un'idea ancora peggiore del raschiarli con espressioni regolari.
skolima,

8
Ah bene, volevo essere più preciso su ciò che pensavo, ma ero pigro e ho appena reagito al commento ... Penso che tutti possiamo essere d'accordo sul fatto che 1. usare espressioni regolari per analizzare l'intero documento sia una cattiva idea 2. usare parser XML per analizzare l'HTML è una cattiva idea 3. usare parser XML per analizzare l'XHTML è giusto 4. usare espressioni regolari per recuperare una riga o alcune informazioni molto specifiche dall'HTML sono giuste. O potrei semplicemente riassumerlo: lo strumento giusto per il lavoro giusto ...
Jalayn,

23

So che non stai chiedendo risorse, ma padroneggiare le espressioni regolari di Jeffrey EF Friedl è stato il modo in cui ho imparato come funzionano e come usarle. Anche dopo essere arrivato al punto di usarne molti per analizzare diverse cose, il primo capitolo aveva cose nuove per me.

Vuoi capire quei dannati regexp? Leggi questo libro.


2
Questa dovrebbe essere la risposta definitiva.
magro,

1
+100.000 Uno dei migliori libri tecnici di sempre, e convenientemente sull'argomento della domanda.
Affe il

Mi è piaciuto molto questo libro. Il punto chiave è che mi ha aiutato a capire tutte le diverse funzionalità disponibili in Regex. Non sarai in grado di memorizzare tutta la sintassi dalla lettura di un libro, ma il libro ti mostrerà tutte le cose che esistono in modo da sapere quali strumenti hai per risolvere un problema quando si presenta.
Kibbee,

Assolutamente +1 per questa risposta. Mi sono agitato su regex fino a quando finalmente mi sono seduto e ho letto questo volume essenziale riga per riga. Ora Friedl mi ha dato abbastanza fondamenta da poter ragionare su tutte le molte varianti non standard che oggi ci affliggono! Consiglio vivamente questo riferimento all'OP e a tutti gli altri. +1 a @slim per il suo commento, anche!
John Tobler,

19

Dov'è l'inizio, la fine? Quando il processore regexp avanza sul testo, quando mantiene la sua posizione e prova un'altra corrispondenza? eccetera.

Vorrei iniziare chiarendo i tuoi obiettivi e quindi capire il tuo stile di apprendimento .

Ciò che mi ha colpito della tua domanda è che mi chiedi "come imparo le espressioni regolari?" e poi immediatamente seguire la domanda "come funziona il motore delle espressioni regolari internamente?" Sembra che tu stia insinuando che queste due cose hanno qualcosa a che fare l'una con l'altra, il che è un punto significativo. Forse sei una persona che impara come funziona qualcosa smontandolo o costruendolo da solo.

Per le applicazioni per principianti, di solito non è necessario capire come funziona uno strumento per utilizzarlo in modo efficace. Non è necessario sapere come funziona un motore per trapano per praticare fori nel legno; devi capire come usare il trapano, non come costruirlo .

Qual è il tuo obiettivo? Hai intenzione di imparare a costruire un motore di espressione regolare? o hai intenzione di imparare come utilizzare in modo efficace le espressioni regolari per risolvere i problemi aziendali? Il raggiungimento di questi diversi obiettivi probabilmente richiede tecniche di apprendimento diverse.

Per rispondere alla tua domanda specifica su come funziona il motore delle espressioni regolari: dipende. L'approccio teorico "classico" alle espressioni regolari è quello di utilizzare l'espressione regolare come modello per un automa finito non deterministico, quindi costruire l'equivalente automa finito deterministico e quindi eseguire quell'automa contro l'input.

Quasi nessuno lo fa per diversi motivi. Innanzitutto, il numero di stati moltiplicato per il numero di possibili caratteri di input produce una tabella di transizione di stati che è stranamente enorme anche per le piccole espressioni regolari. Certo, gran parte di ciò può essere compresso, ma è ancora un sacco di regole di transizione. In secondo luogo, altri approcci sono generalmente più veloci. Terzo, le cosiddette espressioni "regolari" si trovano nelle moderne librerie regexp, niente del genere. Non sono affatto lingue normali ; sono spesso riconosciuti dagli automi pushdown, non dai linguaggi automi finiti.

(Ho iniziato a scrivere una lunga serie su come funzionano tutte queste cose, ma sono rimasto senza parole dopo solo i primi dodici articoli . Potresti trovarle interessanti se desideri un breve primer sullo sfondo teorico delle espressioni regolari di base.)

I motori di espressioni regolari reali invece utilizzano in genere una strategia di backtracking. Il motore di espressione regolare che abbiamo creato per il motore JScript oltre un decennio fa ora compila l'espressione regolare in un linguaggio bytecode che include primitive per riconoscere sequenze e tornare indietro agli stati precedenti. Abbiamo quindi creato un interprete per quel linguaggio bytecode.

Non proverei a capire come funziona un motore regexp prima di avere una comprensione abbastanza solida di come usare le espressioni regolari. Concentrati prima di iniziare a scavare nelle strategie di ottimizzazione di vari motori diversi.


+1 perché si affrontano diverse cose che è bene sapere quando si usano le regex; Non sono tuttavia d'accordo sul tuo giudizio secondo cui non è necessario conoscere gli interni. Per la perforazione, hai perfettamente ragione; nei computer, ho scoperto che prima di quanto pensassi all'inizio, arrivo al punto in cui devo capire gli aspetti interni di qualcosa per padroneggiarne l'applicazione, che si tratti di C ++ (compilatori), web server (HTTP) o regex (teoria degli automi) . Non al punto in cui divento un esperto, ma una buona comprensione dei principi di base è spesso il modo più rapido per imparare.
Felix Dombek,

3
@Felix: penso che in realtà siamo d'accordo. Ho detto che per le applicazioni di principiante non c'è di solito non c'è bisogno di capire come uno strumento lavora al fine di utilizzarlo. Quelle parole da donnola erano intenzionali. Per il giornalista o l' uso magistrale di uno strumento è molto utile capire almeno qualcosa sui suoi interni in modo da poter prevedere con precisione dove lo strumento avrà prestazioni scadenti, per esempio.
Eric Lippert,

Hmm, dovrei essere in disaccordo un po '. Alcuni dei programmi aziendali più utili che ho realizzato hanno usato la teoria che ho appreso in lexx e yacc per risolvere i problemi in modo efficiente. Hai ragione, tuttavia, non è necessaria una completa comprensione del livello di dottorato . Dovrò leggere i post del blog, sembrano più interessanti.
Spencer Rathbun,

Dici che le espressioni regolari non sono regolari - ma pensavo che il mondo regolare nel nome si riferisse alle espressioni che corrisponde - ad esempio l'espressione regolare "[0-9]{3}"che può corrispondere a qualsiasi numero di tre cifre, e il numero di tre cifre 480 è un esempio per un normale espressioni corrispondenti.
configuratore

1
@configurator: una lingua "normale" è per definizione una lingua che può essere riconosciuta da un automa finito. Ogni linguaggio regolare può essere caratterizzato da una "espressione regolare" che consiste solo di unioni, alternative, catenazioni e stella di Kleene. Ma la maggior parte dei motori di "espressione regolare" oggigiorno riconoscono lingue più complesse di quelle normali; ad esempio, il linguaggio delle "frasi con parentesi correttamente abbinate" non è regolare, ma è possibile abbinarlo con una "espressione regolare" in alcuni motori regexp.
Eric Lippert,

6

Come diamine posso affrontarli?

Come ogni cosa nuova:

10 Study
20 Practice
30 goto 10

Studia

Trovo che gli insegnanti di maggior successo inizino a insegnare qualsiasi materia fornendo prima un po 'di background alla materia. È importante avere un contesto di ciò che stai imparando e, soprattutto, perché lo stai imparando.

È tutta la corrispondenza delle stringhe

Le espressioni regolari sono un mezzo per abbinare modelli nel testo. È un linguaggio dichiarativo stesso incorporato in numerosi altri linguaggi di programmazione.

Mi piacerebbe sottolineare che si tratta di un linguaggio dichiarativo, le espressioni regolari sono utili per esprimere quello che stringa da abbinare, ma non lo fanno in alcun modo esprimere quanto il programma è quello di andare a fare l'abbinamento. Per questo motivo è possibile utilizzare espressioni regolari molto rapidamente e molto lentamente nello stesso linguaggio di programmazione semplicemente utilizzando un parser RegEx diverso.

Il motivo della creazione di espressioni regolari è lo stesso per la creazione della maggior parte dei linguaggi di programmazione: i programmatori si sono ritrovati a svolgere lo stesso complicato compito più e più volte e hanno deciso di voler un modo più semplice di scrivere il codice.

Alcuni si lamenteranno (e dovrebbero) della mia frase precedente dicendo qualcosa sulla falsariga di:

RegEx non semplifica un programma.

è vero

RegEx non semplifica un programma, RegEx semplifica la scrittura del programma. Devi ancora essere accurato nei tuoi test per essere sicuro che tutti i casi corretti siano abbinati correttamente e tutti i casi errati no. È davvero difficile testare "tutto", e con schemi complicati, è davvero difficile testare "la maggior parte". Nel peggiore dei casi, dovresti comunque provare "alcuni" casi.

incorporiamo alcuni esempi che ho scelto obbligatoriamente il motore RegEx di JavaScript perché posso provarlo facilmente dal vivo nel browser e perché non dovrò fare alcun escape di stringa durante l'uso dei letterali RegEx.

Quando si esegue la normale corrispondenza delle stringhe, si verifica un valore di stringa con un altro. Possono provenire da qualsiasi luogo, ma alla fine sono necessarie due stringhe per confrontarle:

if ( 'foo' == 'bar' ) doSomething();

Questo esempio fa schifo perché non potrà mai fare nulla

if ( foo == 'bar' ) doSomething();

Molto meglio; ora, in realtà non sappiamo in anticipo se verrà fatto o meno qualcosa. Ora possiamo iniziare ad accettare l'input dell'utente:

if ( prompt( 'Say "bar" to do something.' ) == 'bar' ) doSomething();

Meraviglioso, ora gli utenti possono inserire bare succederà qualcosa, fino a quando non riceverai segnalazioni di bug da parte di utenti che affermano che "bar"non funziona o che "BAR" non funziona o che hanno digitato BRA100 volte e non succede mai nulla.

Ignorando gli errori di ortografia e i caratteri extra 'bar' != 'BAR'e i programmatori devono escogitare un modo per testare dove i personaggi sono nel caso sbagliato.

Soluzione semplice, uso toLowerCase. Funziona meravigliosamente, ma per quanto riguarda i nostri utenti che usano l'inglese britannico sull'inglese americano quando si abbina something == 'color'? Ora dovrai abbinare something == 'color' || somthing == 'colour'.

Per farla breve, i modelli semplici si trasformano molto rapidamente in molti codici ripetitivi.

L'esempio di colore può essere semplicemente abbinato a:

/colou?r/.test( something )

una solida conoscenza delle basi delle espressioni regolari può ridurre significativamente la quantità di tempo sprecata per reinventare la ruota.

Dove studiare

La maggior parte delle lingue che implementano le espressioni regolari hanno almeno una risorsa disponibile per la sintassi specifica dell'uso delle espressioni regolari all'interno di quella lingua. Uno per JavaScript può essere trovato su MDN

leggilo.
tutto.
poi leggilo di nuovo.

Ci vuole tempo per imparare, pensarlo come un investimento: un'ora per imparare RegEx ora risparmia un'ora la prossima volta che è necessario eseguire una corrispondenza del modello di stringa, e poi un'altra ora la volta successiva.

Pratica

Dopo aver letto tutto su RegEx, probabilmente non capirai gran parte di esso. Questo perché in realtà non ci fai nulla.

Ho menzionato il motivo per cui ho scelto JS per questo esempio, ti esorto a confonderlo nel tuo browser. È veloce e puoi farlo direttamente nella barra degli URL.

JS ha alcuni modi diversi e semplici di utilizzare RegEx:

string.match( regex )
regex.exec( string )
regex.test( string )

A partire da qualcosa di semplice come:

javascript:'color'.match(/colou?r/);

è un modo semplice per mettere il piede nella porta. Gioca con esso, spezzalo per vedere cosa corrisponde e cosa no.

Quando rimani bloccato nella pratica, continua a farlo 30. Devi leggere per saperne di più, ma devi esercitarti per capire veramente cosa hai imparato.


+1 per raccomandare il messing con JavaScript nel browser.
John Tobler,

5

Brian Kernighan scrive un semplice processore reg-ex nel libro Beautiful Code . Mi rendo conto che non stai cercando risorse, ma potrebbe aiutare a vedere un'implementazione di base , all'interno.


Il "processore regex" menzionato in realtà non implementa le disgiunzioni e, con l'approccio dato, è molto difficile aggiungerle. Mi piace il libro, ma questa è una cosa di cui sono rimasto deluso.
Felix Dombek,

4

Nello sviluppo normale, il codice di debug può fornire informazioni molto utili. Le espressioni regolari non sono diverse. Quindi, a rischio di sembrare una pubblicità, prendi RegexBuddy . Ha un ottimo strumento per visualizzare visivamente cosa sta facendo il motore mentre gestisce la tua espressione e la stringa di input.


1
+1, "Regex Hero" è anche bello: regexhero.net/tester
Angelo

Regexbuddy è uno dei miei strumenti preferiti. Vedere la vista ad albero è incredibilmente utile, in quanto è in grado di testare istantaneamente mentre generi la tua regex. Ho imparato molto più regex senza cercare di impararlo semplicemente usandolo.
Chao,

1
Ho sempre trovato RegexBuddy interessante, ma non mi piace doverlo comprare. Per i test regex di base, ci sono molte altre utilità. Per vedere una descrizione testuale della regex anche se ci sono meno strumenti. Lo fa anche la versione a pagamento di Regex Hero. Una cosa piuttosto singolare di RegexBuddy è il Regugger Debugger, che mostra ogni accettazione o rifiuto di un personaggio e ogni backtrack con dettagli escrutanti, che può davvero aiutare quando si esegue il debug di una regex grande e molto complicata. Non ho notato nessun altro strumento che lo faccia.
Kevin Cathcart,

3

Le espressioni regolari possono diventare molto complicate molto rapidamente, quindi ti consiglio di iniziare ad impararlo usando i tutorial. Sappi che la forma più semplice di espressione regolare è una stringa che rappresenta ciò che stai cercando. Sfortunatamente, per poter definire regole di ricerca speciali, sono necessari determinati caratteri e questi caratteri devono essere sfuggiti o si crea un'espressione regolare non valida o errata.

Il mio consiglio è di iniziare con un esempio di qualcosa che stai cercando e scappare. Quindi, in altre parole, se stavi cercando qualcosa tra parentesi, prendi un esempio di una di queste stringhe nel testo in cui stai cercando: (this is an example of something you'd want to find)

Inizia sfuggendo ai caratteri in modo da cercare il carattere letterale: \(this is an example of something you'd want to find\)

Provalo, verifica che trovi il tuo esempio correttamente. Quindi generalizza l'espressione per trovare tale testo, non solo l'esempio che hai trovato. Quindi diventerebbe: \([^)]*\) (indica qualsiasi carattere che non sia ")" per qualsiasi numero di occorrenze, incluso 0).

Provalo di nuovo e verifica che non solo trovi il tuo esempio, ma piace anche ad altri. Cerca espressioni regolari più complicate ma più frequenti su Internet e correggile con le espressioni regolari esistenti per evitare di doverti preoccupare di ogni singola possibilità.

Questo è tutto. E oh, impara e ama \ Q ... \ E. Nella maggior parte dei linguaggi di espressione regolari, \ Q indica l'inizio di un modello letterale e \ E segna la fine, nel caso in cui si debba affrontare la ricerca di modelli particolarmente sofisticati e non si sappia sfuggire. Mi ha salvato la vita più di un paio di occasioni.


3

Ti darò una risposta semplice per una semplice domanda. Innanzitutto, devi capire cosa sono le espressioni regolari (RegEx): cosa fanno, a cosa servono. Quindi, un ottimo strumento per iniziare.

  1. Che cos'è? RegEx è un linguaggio per esprimere la corrispondenza dei modelli. Vale a dire, usandolo, puoi creare una combinazione di caratteri che riconosce o trova schemi nel testo. Quanto è utile? Nella programmazione, puoi dire ai computer di abbinare il testo da una fonte (un input dell'utente, una pagina web, ecc.) E rilevare se al suo interno sono contenuti o meno schemi specifici di testo. Ad esempio, un punto (.) Rappresenta qualsiasi carattere - lettera o numero. I numeri tra parentesi graffe rappresentano i numeri di iterazioni, quindi ". {1,30}" indica qualsiasi carattere, ripetuto tra 1 e 30 volte - in altre parole, non puoi avere una stringa vuota e non può essere più lunga di 30 personaggi. E continua da lì.

  2. Come iniziare ad imparare? Lo strumento migliore in assoluto che ho visto è Expresso , ma è solo per Windows. Ha una GUI molto ampia in cui fai clic sugli elementi che desideri aggiungere alla tua espressione, quindi un tester per verificarlo con vari input per vedere i risultati. Non ho visto nulla di buono sul Mac (ma sto eseguendo Windows su VMWare, quindi non ho davvero bisogno di una versione per Mac), non ho trascorso molto tempo a guardare su Linux.


1
Grazie per il suggerimento su Expresso. L'ho provato ed è fantastico!
Jim In Texas,

3

Oltre a un buon riferimento, il modo in cui impari davvero è usare buoni strumenti di apprendimento. Uno sta usando l' editor Vim open source , con due opzioni impostate:

  1. : imposta incsearch ... mentre digiti un modello di ricerca sulla riga di comando, l'editor al volo salta al primo pezzo di testo che corrisponde ed evidenzia esattamente ciò che corrisponde. Se digiti qualcosa che non lo fa più corrispondere a nulla, Vim riporta il cursore sul punto in cui eri all'inizio.
  2. : imposta hlsearch ... questo dice a Vim di mostrare uno sfondo evidenziato su tutto il testo che corrisponde alla ricerca RE corrente.

L'altro è utilizzare una chiamata di strumento gratuita RegExCoach . Si incolla nel testo che si desidera cercare, quindi in un'altra finestra si sviluppa la tua espressione regolare. Come Vim, mette in evidenza le partite di successo al volo.


RegExCoach è ora shareware. L'ho trovato molto utile nello sviluppo di complessi RE in stile Perl.
Firstrock,

2

Si inizia con un confronto di stringhe di base. Molto facile, ma anche non così potente.

Successivamente, potrebbe esserti verificato che hai bisogno di confronti senza distinzione tra maiuscole e minuscole, in modo che "greco" e "GreeK" siano uguali. Questo è un po 'più potente.

Un giorno noterai che piccole differenze nell'ortografia non dovrebbero impedire a 2 parole di comparare uguali: cioè "organizza" e "organizza" dovrebbero comparare uguali. Ti siedi e scrivi del codice che fa questo e sei felice.

Fino a quando non riusciamo ad astrarre un po 'di più e ti rendi conto che a volte vuoi che tutte le parole che finiscono in "ize" siano uguali a quelle dei loro fratelli nell'ortografia britannica. Oppure, ripetizioni di alcune stringhe un certo numero di volte. E, naturalmente, devi combinare tutto ciò.

E così via. Infine, molto probabilmente finirai con una notazione in cui non tutti i personaggi si distinguono da soli. Nient'altro è una regexp. Lo si può vedere come una descrizione di una serie di stringhe.

E poi, è abbastanza facile e si riduce ai seguenti 3 principi di base:

Hai regexps di base: caratteri che si distinguono da soli, classi di caratteri, abbreviazioni utili e non così utili per classi di caratteri come \ d o \ p {Lu} per le lettere maiuscole.

E poi, hai alcune possibilità per combinarli: se r1 e r2 sono regexps, allora lo sono anche r1r2 r1 | r2 (r1).

Ultimo, ma non meno importante, i modificatori di ripetizione: r? r * r + r {n, m}

Questa è la maggior parte che devi sapere. Qualsiasi altra cosa puoi cercare quando ne hai bisogno.


2

Altre due buone risposte ti dicono di imparare la teoria alla base delle regex e di esercitarti, che sono entrambi ottimi consigli. Consiglierei anche di ottenere un buon strumento di regex visivo per aiutarti se sei serio.

RegexBuddy , ad esempio, ha una modalità di debug visiva che ti consente di eseguire l'esecuzione di una regex e ti mostra attraverso punti salienti e testo esplicativo cosa sta facendo il motore regex in ogni fase. C'è un video che dimostra questo debug sul loro sito.



1

Per me, vedere ciò che il regexp sta abbinando mentre lo sto costruendo mi aiuta davvero a semplificarmi la vita e mi ha aiutato a comprenderli meglio.

Per fare ciò, aprirò un file con il testo di destinazione in Emacs e quindi userò il isearch-forward-regexpcomando. Quando entri nella regexp, Emacs ti mostra che cosa corrisponde (questa è la parte "isearch").

Per eseguire il comando, in Emacs, puoi usare <ESC>xisearch-forward-regexp.


1

Ho imparato le espressioni regolari imparando flex e bisonte, che sono usati per costruire analizzatori lessicali e parser. Non si può avere un parser senza espressioni regolari, e il libro lexx e yacc è incredibilmente bravo a percorrere la teoria senza muoversi troppo velocemente.

Fondamentalmente, praticamente tutti i motori regex in questi giorni seguono gli stessi principi. Sono tutte macchine a stati finiti e se lo fai davvero, allora hai un vantaggio su quasi tutti i codici che scrivi. È simile all'apprendimento della ricorsione in quanto, una volta ottenuto, lo applichi istintivamente ai problemi. Sono facili da risolvere con lo strumento giusto, ma molto difficili senza di esso.

Un'altra cosa sull'apprendimento di lexx e yacc, rispetto alle espressioni regolari, è che impari come funzionano internamente. Come il programma guarda al futuro, perché termina una partita, come contiene i dati e molto altro ancora. Comprendere i puntatori è un must assoluto, ma se ottieni lexx e yacc e lo attraversi dall'inizio, imparerai tutto ciò che ti è stato chiesto e avrai uno strumento enormemente potente per il resto della tua carriera.

Questa domanda include un sacco di risorse per l'apprendimento e uno scheletro flessibile che ho messo insieme.


1

Prima di tutto, provo innanzitutto ad assicurarmi che non ci sia un modo più semplice per risolvere il problema / "tokenizzare" la stringa.

Quando non riesci a trovarne uno, lo vedo come un problema non cercare di abbinare ciò che vuoi fuori dalla stringa, piuttosto, è una questione di NON abbinare ciò che non vuoi. Questo principalmente perché i regex sono avidi. Ma mi è servito bene come approccio per ottenere ciò che voglio.

Ecco un esempio:

string = "Sep 22 19:57:38 host fcron[9137]: \
          Job fbsetbg -r $HOME/backgrounds/ \
          started for user user (pid 9138)"

per abbinare il minuto:

string.match /^\w+\s\d+\s\d+:(\d+):\d+\s\w+\s/ # correct but bad
string.match /\d+:([^:]+):\d+/                 # correct and good

Invece di cercare di trovare il tempo insieme a tutto il resto, prova a trovare i confini distinti.

L'esempio è un po 'inventato, ma tutto ciò che ho potuto inventare.


1

Un approccio che ho usato è stato quello di trovare un sacco di progetti open source che necessitavano di aggiornamenti di sintassi e quindi scrivere uno script sed sempre più complesso, che comprendeva molte espressioni regolari.

Lo script doveva essere eseguito su molti file diversi in ogni progetto open source. Quindi essere eseguito contro molti progetti diversi con stili diversi. Ho iniziato con qualcosa di molto semplice come %s/before/after poi ho scoperto che corrispondeva a troppi casi. così ho aggiunto più cose per impedirlo. Poi ho trovato diversi progetti usando diversi stili di sintassi che necessitavano di cambiamenti diversi.

Alla fine ho finito con

  • grandi capacità e conoscenze sulle espressioni regolari
  • buone capacità con sed
  • aiutare molti progetti open source
  • ottenere molte attività di contributo mostrate sul mio profilo github
  • un altro buon strumento "coltellino svizzero" per la cintura virtuale

ed è stato aiutato in questo approccio dalla necessità di

  • raggiungere obiettivi reali senza barare
  • usare le abilità (regex) come parte di un obiettivo più grande con maggiore motivazione.
  • essere in grado di dimostrare le capacità acquisite modificando il codice degli altri e facendo rivedere le modifiche.

Trasmetterò anche che ci sono un sacco di siti per le varie lingue - ruby, javascript, ecc. Che ti permetteranno di giocare con espressioni e testo di esempio per una gratificazione immediata. Questi sono:

regex in più lingue su un sito

concentrarsi sui gruppi di partite:


0

Ho scoperto che l'apprendimento delle espressioni regolari è simile all'apprendimento delle tabelle di moltiplicazione: sì, devi capire le idee alla base, ma alla fine devi farlo spesso e ripetutamente.

Quando stavo imparando, mi ero prefissato l'obiettivo di fare alcuni esercizi di regex al giorno. In pratica, questo significava almeno una volta al giorno, avrei provato a guardare una stringa o un testo sul mio schermo e mi sarei presentato una sfida: "posso ottenere tutti gli indirizzi e-mail da qui" o "trovare tutti i occorrenze della parola "codice" utilizzata come verbo anziché come sostantivo, "cose ​​del genere.

Farlo per alcune settimane è stato davvero ripagato - e, naturalmente, sono necessarie revisioni periodiche e aggiornamenti. Sto per uno.

Ho trovato utile anche questo strumento online, in quanto mi consente di testare regex in tempo reale: http://www.gethifi.com/tools/regex

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.