2010-07-21 12 views
9

devo un'espressione regex che attraversa una stringa e tira fuori 40 valori, sembra specie se come la domanda sotto, ma molto più grande e più complicatoespressione Regex per eseguire il riferimento più di 9 valori in una sostituzione

est(.*)/test>test>(.*)<test><test>(.*)test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test> 

La mia domanda è come utilizzare queste espressioni con il comando replace quando il numero supera 9. Sembra che ogni volta che uso \10 restituisca il valore per \1 e quindi aggiunga un 0 alla fine.

Qualsiasi aiuto sarebbe molto apprezzato grazie :)

Anche io sto usando UEStudio, ma se un altro programma lo fa meglio quindi non disperatevi :)

+5

In Sublime Text, "\ 10" non funziona, ma "$ 10" FUNZIONA. –

risposta

3

La maggior parte dei semplici motori Regex utilizzato da editori non sono in grado di gestire più di 10 gruppi corrispondenti; non sembra come la lattina di UltraEdit. Ho appena provato Notepad ++ e non sarà nemmeno corrispondere a a un'espressione regolare con 10 gruppi.

La tua migliore scommessa, penso, è scrivere qualcosa velocemente in un linguaggio veloce con un parser regex decente. ma che non avrebbe risposto alla domanda come chiesto

Ecco qualcosa in Python:

import re 

pattern = re.compile('(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)') 
with open('input.txt', 'r') as f: 
    for line in f: 
     m = pattern.match(line) 
     print m.groups() 

Nota che Python permette backreference quali \20: al fine di avere un backreference al gruppo 2 seguito da un letterale 0, è necessario utilizzare \g<2>0, che non è ambiguo.

Edit: La maggior parte dei sapori della regex, ed editori che comprendono un motore di espressioni regolari, dovrebbe seguire la sintassi sostituire come segue:

abcdefghijklmnop 
search: (.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(?<name>.)(.) 
note: 1 2 3 4 5 6 7 8 9 10 11 12 13 
value: a b c d e f g h i j k l m 
replace result: 
    \11  k1  i.e.: match 1, then the character "1" 
    ${12} l  most should support this 
    ${name} l  few support named references, but use them where you can. 

Named riferimenti sono generalmente possibili solo nel sapore molto particolare di biblioteche regex, prova il tuo strumento per sapere con certezza.

+2

"Alcune persone, di fronte a un problema, pensano" Lo so, userò le espressioni regolari. "Ora hanno due problemi." - Jamie Zawinski la citazione di cui sopra non è mai sembrata così vera: ( grazie per l'aiuto :) –

1

Se non si riescono a gestire più di 9 sottogruppi, perché inizialmente non corrispondono ai gruppi di 9 e quindi eseguono il ciclo e applicano le espressioni regolari a tali corrispondenze?

vale a dire prima corrispondenza (<test.*/test>)+ e quindi per ogni sottogruppo corrisponde su <test(.*)/test>.

+0

Purtroppo nel mio caso che non avrebbe funzionato, il modello è abbastanza grande. Comunque apprezzo il suggerimento. Grazie :) –

9

Come indicato da psycho brm: Utilizzare $ 10 invece di \ 10 Sto usando Notepad ++ e funziona in modo bello.

1

Provare a utilizzare i gruppi con nome; così invece del decimo:

(.*) 

uso:

(?<group10>.*) 

e quindi usare il seguente sostituire stringa:

${group10} 

(Questo è ovviamente in assenza di una soluzione migliore usando loop e ricorda che potrebbero esserci diversi tipi di sintassi della sintassi regex a seconda dell'ambiente.)

+0

Questo ha funzionato per me quando si utilizza la corrispondenza delle espressioni regolari in nginx, che sembra non corrispondere a più di 9 gruppi. Lo stesso problema che l'OP ha dove $ 10 viene interpretato come $ 1 + 0. – theChumpus

0

mettere un $ davanti al sottogruppo a doppia cifra: ad es. \ 1 \ 2 \ 3 \ 4 \ 5 \ 6 \ 7 \ 8 \ 9 $ 10 Ha funzionato per me.

Problemi correlati