Modelli di stringhe che possono essere utilizzati per filtrare e raggruppare i file

2

Una delle nostre applicazioni filtra i file in determinate directory, estrae alcuni dati da essa ed esporta un documento dai dati estratti. L'algoritmo per l'estrazione dei dati dipende dal file e finora usiamo regex per selezionare l'algoritmo da utilizzare, ad esempio .*\.txt verrà elaborato dall'algoritmo A, foo[0-5]\.xml verrà elaborato da algo B, ecc.

Tuttavia ora abbiamo bisogno di alcuni file da elaborare insieme. Ad esempio, in un caso abbiamo bisogno di due file, foo.*\.xml e bar.*\.xml . Parte delle informazioni da estrarre esiste nel file foo e l'altra parte nel file bar . Inoltre, dobbiamo assicurarci che la wild card sia compatibile. Ad esempio, se ci sono 6 file

foo1.xml
foo23.xml
bar1.xml
bar9.xml
bar23.xml
foo4.xml

Mi aspetterei che foo1 e bar1 siano identificati come un gruppo, e foo23 e bar23 come un altro gruppo. bar9 e foo4 non hanno una coppia, quindi non saranno trattati.

Ora, dal momento che il filtro è configurato dall'utente, abbiamo bisogno di un modello che possa esprimere il requisito di cui sopra. Non penso che tu possa esprimere un significato come sopra nella regex standard. (foo|bar).*\.xml corrisponderà a tutti i 6 file sopra e non possiamo identificare quale file è accoppiato per un particolare file.

Esiste uno schema standard in grado di esprimerlo? O qualche idea su come modificare regex per supportare questo, che può essere implementato facilmente?

    
posta Louis Rhys 27.09.2012 - 08:55
fonte

1 risposta

1

Penso che ciò che hai in mente possa essere risolto con backreferences . Vedi, ad esempio, qui:

link

o qui

link

Un'espressione come

(foo([0-9])\.xml) .* (bar\.xml)

applicato alla lista separata di spazi dei nomi di file ti fornirà coppie come foo1.xml , bar1.xml come corrispondenze. Naturalmente, potrebbe essere necessario risolvere il problema di portare i nomi dei file in ordine corretto prima (o fornire un exp del registro che è indipendente dall'ordine dei file).

EDIT: relativo all'ordine dei file: è possibile specificare questo con due regole diverse, poiché suppongo che si desideri eseguire l'elaborazione in un ordine specifico. Quindi quando l'espressione sopra ti offre una coppia

(filename1,filename2)  

esegui l'elaborazione algo P con parametri

P(filename1,filename2)

e quando la seconda regola

(bar([0-9])\.xml) .* (foo\.xml)

ti consegna una coppia

(filename1,filename2)  

chiami P con l'ordine dei nomi passati:

P(filename2,filename1)  

Ovviamente, a seconda del tuo processore reg exp, puoi anche usare le nuove linee per separare i nomi dei file e usare la corrispondenza multilinea. Ho usato gli spazi bianchi sopra solo per scopi di dimostrazione più semplici.

    
risposta data 27.09.2012 - 10:02
fonte