E 'possibile scrivere un'espressione regolare che fa una ricerca quindi usa i risultati per fare un'altra ricerca?

3

Sto cercando stringhe che corrispondono allo schema [A-Z]\W*[0-9]+ , quindi in

V-2345
35A235
Q252

il V-2345 e Q252 corrisponderebbero. In un altro elenco, voglio trovare elementi equivalenti che si adattino allo stesso modello regex, in modo che le potenziali corrispondenze includano:

V ++ 2345
Q 252

ma non

V-252
Q//2345

In sostanza, se un elemento corrisponde al modello nel primo elenco, desidero cercare il prefisso di tale lettera e il suffisso numerico nella seconda lista. Esiste un termine per usare regex per fare questo tipo di ricerca? So che posso semplicemente scrivere la mia ricerca usando la manipolazione delle stringhe per ottenere la lettera e il numero, quindi usarli per comporre un modello regex separato per ogni ricerca della seconda lista, ma mi chiedo se c'è qualcosa di incorporato nella regex tipica sapori (sto usando C # in questo caso) che serve a questo scopo in modo che io possa semplicemente usare il modello originale.

    
posta sigil 08.02.2016 - 08:13
fonte

1 risposta

4

Le espressioni regolari funzionano su stringhe, non su una "lista di stringhe" e non su più elenchi di stringhe. Ovunque sia necessario elaborare più di una stringa, in genere è necessario un codice ambientale per eseguire l'elaborazione. Per il tuo esempio, questo codice deve applicare la regex a ogni elemento del primo elenco, quindi raccogliere i risultati e utilizzare questi risultati per elaborare il secondo elenco.

Detto questo, il solito approccio per applicare un regexp a un elenco di stringhe è concatenarle con un carattere separatore come "newline". Per concatenare due elenchi e distinguerli, è necessario almeno un carattere o parola speciale "magico" per separare il primo elenco dal secondo, che non fa parte dell'elenco. L'uso di tale magia può causare mal di testa di manutenzione se non si presta molta attenzione, tuttavia combinando questo con backreferences , questo può essere usato per risolvere il tuo problema.

Ad esempio, backreferenze numerate come a si riferiscono ad altri gruppi di cattura trovati prima. Supponiamo che tu abbia usato "###" come separatore per i due elenchi, un regexp lungo le linee di

  ^([A-Z])\W*([0-9]+)$.*###.*^(\W*\+\+\W*)$
    ^         ^          ^     ^           ^
    |         |          |     |           |
   first    second       |    backrefs to first
   group    group        |    or second group
                       lists
                       separator

potrebbe essere una prima approssimazione per quello che stai cercando (attenzione ai bug, non l'ho provato). Metti questo in una ricerca globale delle espressioni regolari, quindi dovrebbe produrre tutte le coppie di corrispondenze che si adattano ai tuoi vincoli.

Come ultima osservazione: il codice risultante può essere molto compatto, tuttavia difficile da mantenere (e probabilmente più lento) rispetto a una soluzione più esplicita in cui si elaborano i due elenchi individualmente.

    
risposta data 08.02.2016 - 09:00
fonte

Leggi altre domande sui tag