2011-11-30 15 views
11

codice semplice:perl: come ottenere la regex originale dalla versione precompilata?

use 5.014; 
use warnings; 

my $re = <DATA>; 
chomp $re; 
my $re2 = qr/$re/; 
say $re2; 
__END__ 
^\w$ 

risultato:

(?^u:^\w$)  #added the (?^u: 

è un modo corretto di decompilare $ RE2 tornare la regex originale?

Motivazione: l'espressione regolare è un valore di configurazione, in modo da necessità:

  • leggerlo
  • compilarlo
  • salvarlo sul file per il successivo utilizzo.

Ma non può salvare la regex compilato per l'uso successivo, perché in ogni compilazione del regex ma ho ampliato con la (^ u :, così dopo diversi cicli ho finito con il simile:?

(?^u:(?^u:(?^u:(?^u:(?^u:^\w$))))) 

quindi la domanda sono:

  • è qui alcun modo corretto, come salvare la versione compilata
  • se nessun modo - come decompilare, per ottenere la versione originale
  • 01?
  • qualche idea?
+0

Tu dici che leggere il modello da un file, in modo da avere ciò che si desidera salvare in un file, quindi perché non lo salvi? – ikegami

risposta

14

Mentre dovevo solo mantenere la copia di stringa in giro per l'utilizzo dei dati e quindi compilare una copia quando avevo bisogno di usarlo, è anche possibile utilizzare la funzione regexp_pattern dal modulo core re per restituire il modello utilizzato per creare un compilato regex:

use re 'regexp_pattern'; 

print regexp_pattern qr/^\w$/; 

stampe

^\w$ 
+0

Questo è esattamente ciò di cui ho bisogno. Lavorando con perl sopra 5.10 - così bene ...;) THANX! – jm666

+0

Questo non è ciò che viene stampato, almeno non in 5.14. – ikegami

+0

Inoltre fallisce per qr/foo \/bar/ – ikegami

4

re::regexp_pattern

crediti verso vpit per la precisazione su MagNET #perl.

+0

Basta leggere che qui è un'altra risposta per l''uso re ...'. Grazie anche a daxim - sfortunatamente ne posso accettare solo uno .. – jm666

0

Forse il più semplice:

... 
($reoriginal = $re2) =~ s{^\(\?.+:(.+)\)}{$1}; 
say $reoriginal 
+0

Attenzione, versione incoerente: http://stackoverflow.com/q/8082617#comment-10190574 – daxim

3

L'originale è un operatore, non un modello regolare. Solo guardando il primo valore restituito da regexp_pattern (il modello) si verifica una perdita di informazioni. Devi anche guardare il secondo (le bandiere).

qr/foo/     # pat: foo flags: u 
qr/foo/u     # pat: foo flags: u 
use re '/u'; qr/foo/ # pat: foo flags: u 

qr/foo/a     # pat: foo flags: a 
use re '/a'; qr/foo/ # pat: foo flags: a 

qr/foo/i     # pat: foo flags: ui 
use re '/i'; qr/foo/ # pat: foo flags: ui 
use re '/a'; qr/foo/i # pat: foo flags: ai 
use re '/ai'; qr/foo/ # pat: foo flags: ai 

Per ottenere il più vicino possibile si può arrivare a l'operatore originale, si vuole

use re qw(regexp_pattern); 
my ($pat, $flags) = regexp_pattern($re); 
$pat =~ s{/}{\\/}g; 
say qq{qr/$pat/$flags}; 
+0

Grazie mille! – JRFerguson

+0

Sto compilando le mie regex senza flag, quindi la versione semplice di Erics è abbastanza per me. Comunque, grazie mille per la spiegazione dettagliata !!! – jm666

+0

@ jm666, Ancora una volta, se lo sapete, perché avete bisogno di estrarre il modello originale da un re? – ikegami

Problemi correlati