2014-06-14 6 views
5

Perl ha un modificatore piacevole /x che ignora gli spazi bianchi nelle espressioni regolari. Vale a dire non che corrisponda a prescindere dagli spazi bianchi, ma piuttosto che ometti gli spazi bianchi nell'interpretazione della regex a meno che non sia sfuggito.Equivalente alla modalità Perl/x (ignora lo spazio) nelle espressioni regolari R

I.e. ^x[0-7][x-z][ABCpuq*]*$ potrebbe essere scritto in modo equivalente ma molto più leggibile come ^x [0-7] [x-z] [ABCpuq*]*$ nella modalità /x.

grep e il suo ilk in R sembrano non avere tale modalità, ma data la loro compatibilità Perl, c'è un'opzione da passare? Ho provato alcune opzioni ma nessuna fortuna.

> grepl("^x[0-7][x-z][ABCpuq*]*$", "x5yuuA") 
[1] TRUE 
> grepl("^x [0-7] [x-z][ABCpuq*]*$", "x5yuuA") 
[1] FALSE 
> grepl("^x [0-7] [x-z][ABCpuq*]*$", "x5yuuA", perl=TRUE) 
[1] FALSE 
> grepl("^x [0-7] [x-z][ABCpuq*]*$/x", "x5yuuA", perl=TRUE) 
[1] FALSE 

Domanda secondaria: in che modo le regex in stile Perl di R si basano sulla libreria C PCRE? Sembra esserci un PCRE_Extended setting bit che si attiva ignorando gli spazi bianchi.

+0

FYI, Modifica: per la domanda secondaria, aggiunto riferimento al manuale R. – zx81

risposta

6

Free-spaziatura modalità

In R, per usare la modalità senza spaziatura per un'intera espressione, pop il modificatore di modalità (?x) all'inizio della vostra espressione regolare in modalità PCRE (perl=TRUE).

Esempio: (? X)

grepl("(?x) # free spacing\r\n\\d # a digit\r\n[bc] # b or c", subject, perl=TRUE); 

Il modificatore funziona nella maggior parte dei sapori regex. Alcune eccezioni: JavaScript, MySQL, Oracle, VBScript, XPath.

modalità Perl e PCRE

Come da vicino fa la modalità Perl si basa su PCRE? Interamente. (Questa è una buona cosa vedere di seguito..)

Da R manual:

Il perl = argomento TRUE a grep, RegExpr, gregexpr, sub, gsub e passa strsplit alla libreria PCRE che implementa regolare corrispondenza del modello di espressione utilizzando la stessa sintassi e semantica di Perl 5.10, con alcune differenze.

alcuni affinamenti

  • è possibile attivare (?x) in qualsiasi punto della regex
  • si può spegnerlo con (?-x)
  • è possibile accenderlo per un solo set di parentesi, come in (?x: \w \d)

In lode di PCRE

Avere accesso a PCRE è una buona cosa.

PCRE è uno dei contendenti per il titolo del migliore motore in stile Perl, insieme a .NET, il modulo regex di Matthew Barnett per Python e Perl stesso.È ampiamente utilizzato in ambienti ad alta visibilità (Apache, PHP, Notepad ++), quindi riceve molta attenzione. Tra le altre prelibatezze, che consente di accedere alle caratteristiche esotiche come ad esempio:

  • ricorsione e subroutine chiamate
  • \K a "Keep Out" ciò che è stato abbinato così lontano dalla partita restituita
  • Tornando indietro di controllo: (*SKIP)(*F) e altri
  • ripristino Branch (che consente di impostare la cattura Gruppo # 1 in vari punti)
  • (?(DEFINE)..., che può aiutare a refactoring una regex complessa
  • condizionali.

Cosa manca in PCRE?

  • Lookbehind a larghezza infinita (come in .NET) sarebbe un'aggiunta formidabile.
  • Quindi .NET sarebbe davvero divertente balancing groups. Questo probabilmente non accadrà mai perché i gruppi di bilanciamento sono spesso visti come il povero fratello della ricorsione ... Tuttavia, ti permette di fare altre cose, come ad esempio impostare facilmente i contatori.
  • Sottrazione della classe di caratteri.
  • Alcuni potrebbero mancare la corrispondenza fuzzy dal modulo regex di Barnett (impossibile commentare perché non ho usato quella funzione).
+0

Grazie. Lascerà questo per percolare per un po 'ma questo sembra aver risposto completamente. La sezione del manuale PCRE che ho collegato a menzionato '(? X)' e quindi ha avuto la risposta ma mi sembra di averlo saltato sopra, non riconoscendo che era un interruttore che poteva essere passato in linea con la regex. –

+2

@ AriB.Friedman Alcuni raffinamenti notevoli: 1. puoi attivare '(? X)' in qualsiasi punto della regex, 2. puoi spegnerlo con '(? -x)', 3. puoi girarlo acceso per un solo insieme di parentesi con '(? x: \ w \ d)'. Anche PCRE è una delle migliori librerie di espressioni regolari, un contendente per il primo posto, insieme a .NET, Perl e Matthew Barnett per il modulo regex di Python. – zx81

+1

Voglio solo notare che 'Perl! = PCRE'. [Buona lettura] (http://www.manpagez.com/man/3/pcrecompat/) – HamZa

Problemi correlati