2013-12-09 2 views
7
x = r"abc" 
y = r"def" 
z = join([x,y], "|") 

z # => r"r\"abc\"|r\"def\"" 

c'è un modo per join (e, in generale, manipolare) Regex che si occupa solo con il contenuto di regex (vale a dire non trattare il modificatore r come se fosse parte del contenuto). L'output desiderato per z è:Unire le espressioni regolari in julia

z # => r"abc|def" 
+0

Qual è la produzione che stai ricevendo? –

+0

@UriMikhli È l'ultima riga del primo blocco di codice. –

+1

Bene, c'è 'Regex (join ([x.pattern, y.pattern]," | "))', ma non è molto carino, e non so come si comporterebbe in casi più complessi. – DSM

risposta

5
macro p_str(s) s end 
x = p"abc" 
y = p"def" 
z = Regex(join([x,y], "|")) 

L'operatore r "quote" compila in realtà un'espressione regolare per voi che richiede tempo. Se si dispone solo di parti di un'espressione regolare che si desidera utilizzare per crearne una più grande, è necessario memorizzare le parti utilizzando "virgolette normali".

Ma che dire delle regole di escape che si ottengono con r "quote" rispetto a "virgolette normali" che chiedi? Se si desidera che le r regole ma non abbozzati "quote" per compilare immediatamente un'espressione regolare quindi è possibile utilizzare una macro simile:

macro p_str(s) s end 

Ora avete ap "quote" che sfugge come un "quote" r, ma solo restituisce una stringa.

Non andare fuori tema ma è possibile definire un sacco di citazioni per aggirare alfabeti difficili. Ecco alcuni tra quelli convenienti:

         # "baked\nescape" -> baked\nescape 
macro p_mstr(s) s end     # p"""raw\nescape""" -> raw\\nescape 
macro dq_str(s) "\"" * s * "\"" end # dq"with quotes" -> "with quotes" 
macro sq_str(s) "'" * s * "'" end  # sq"with quotes" -> 'with quotes' 
macro s_mstr(s) strip(lstrip(s)) end # s""" "stripme" """-> "stripme" 

Quando hai finito di fare i frammenti si può fare il vostro unirsi e fare una regex come:

myre = Regex(join([x, y], "|")) 

Proprio come si pensava.

Se volete saperne di più su ciò che i membri di un oggetto ha (come ad esempio Regex.pattern) provare:

julia> dump(r"pat") 
Regex 
    pattern: ASCIIString "pat" 
    options: Uint32 33564672 
    regex: Array(Uint8,(61,)) [0x45,0x52,0x43,0x50,0x3d,0x00,0x00,0x00,0x00,0x28 … 0x1d,0x70,0x1d,0x61,0x1d,0x74,0x72,0x00,0x09,0x00] 
+0

Grazie Michael. Sembra che la risposta alla mia domanda sia no. La tua risposta contiene alcune cose interessanti (non sapevo nemmeno di 'dump()'), ma ho già capito che posso costruire regex manipolando parti di stringhe e poi chiamando 'Regex()'. Lo scenario specifico che ho, però, è quando uno ha regex e non stringhe. Immagino che in quel caso devi usare 'pattern'. –

+0

Sembra che una volta che usi join() per combinare le stringhe di p, l'escape ritorna a quello che sarebbe normalmente in una stringa. Quindi il modello combinato non ha la fuga corretta dopo tutto. Potrei mancare qualcosa, ovviamente, dato che sono nuovo di Julia. –