Domanda

Ho visto molti punti in comune nelle funzionalità regex di diversi strumenti/linguaggi abilitati per regex (ad es.perl, sed, java, vim, ecc.), ma ho anche molte differenze.

C'è un standard sottoinsieme di funzionalità regex che tutti gli strumenti/linguaggi abilitati a regex supporteranno?In che modo le capacità regex variano tra strumenti/linguaggi?

È stato utile?

Soluzione

Confronta i gusti delle espressioni regolari

http://www.regular-expressions.info/refflavors.html

Altri suggerimenti

La maggior parte degli strumenti/linguaggi per le espressioni regolari li supporta capacità di base:

  1. Classi/set di personaggi e loro negazione - []
  2. Ancore - ^$
  3. Alternanza - |
  4. Quantificatori - ?+*{n,m}
  5. Metacaratteri: \w, \s, \d, ...
  6. Riferimenti posteriori - \1, \2, ...
  7. Punto - .
  8. Modificatori semplici come /g e /i per globale e ignora maiuscole e minuscole
  9. Personaggi in fuga

Supporto per strumenti/linguaggi più avanzati:

  1. Guarda avanti e dietro
  2. Classi di caratteri POSIX
  3. Confini delle parole
  4. Gli switch in linea consentono l'insensibilità alle maiuscole e minuscole solo per una piccola sezione della regex
  5. Modificatori come /x per consentire formattazione e commenti aggiuntivi, /m per multilinea
  6. Catture con nome
  7. Unicode

Se hai preso la grammatica grep regexp, non quella egrep, o la grammatica sed regexp e l'hai utilizzata, dovresti utilizzare un sottoinsieme sicuro su molte piattaforme e strumenti.

L'unica cosa che potrebbe morderti è quando passi da un'implementazione regexp all'altra utilizzando Finite State Automatons (FSA) a quelle che utilizzano il backtracking, ad es.le implementazioni dei quantificatori varieranno da grep a Perl.

Le implementazioni basate su FSA troveranno la corrispondenza più lunga a partire dalla prima posizione possibile.Quelli che tornano indietro troveranno la prima corrispondenza sbilanciata a sinistra, iniziando dalla prima posizione possibile.Cioè, proverà ogni ramo nell'ordine nel modello finché non verrà trovata una corrispondenza.

Considera la corda "xyxyxyzz", e il modello "(xy)*(xyz)?".I motori basati su FSA corrisponderanno alla sottostringa più lunga possibile, "xyxyxyz".I motori basati sul backtracking corrisponderanno alla prima sottostringa distorta a sinistra, "xyxyxy".

Non esiste un motore standard.Tuttavia, il formato POSIX Extended Regular Expression è un sottoinsieme valido della maggior parte dei motori ed è probabilmente il più vicino possibile a un sottoinsieme standardizzato.

Vedi la sintassi delle espressioni regolari di emacs: http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html#Regexps.

Ricordo di aver letto che la sintassi di emacs è scolpita nella pietra (per ragioni di compatibilità con le versioni precedenti), quindi se vuoi essere compatibile con qualunque cosa, rendi tutto compatibile con questo.Alcuni strumenti potrebbero supportarlo, altri no.

Sebbene tu abbia un obiettivo meritevole, penso che sarà estremamente difficile da raggiungere, e ho anche trovato difficile lavorare con le espressioni regolari di emacs.Forse il 99% di tutto è abbastanza buono se ti rende più felice e produttivo?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top