2013-04-08 15 views
5

Ho un problema con boost::regex::regex_match. Lavoro con attivato BOOST_REGEX_MATCH_EXTRA.Boise regex. Gruppo con nome in due parti


Quello che ho:

(questo è un semplice esempio del mio problema, non è un vero e proprio compito)

string input1= "3 4 5"; 
string input2= "3 4 7"; 

Quello che voglio ottenere:

list output1= [3 4 5]; 
list output2= []; //not matched 

regex:

(questo sta funzionando bene)

((?<group>[0-6])[ ]?)* 

output1: what["group"]=5 e what["group"].captures()= [3, 4, 5]

output2: not matched

Il p roblem is:

Ho bisogno di raccogliere dati da più di uno parte di regex a un gruppo.

ho provato:

((?<group>[0-6])[ ])*(?<group>[0-6]) 

output1: what["group"]=4 e what["group"].captures()=[3, 4]

output2: not matched

OK, ho capito. Non vede la seconda dichiarazione di gruppo.

ho provato:

((?<group>[0-6])[ ])*(?&group) 

output1: what["group"]=4 e what["group"].captures()= [3, 4, 4]

output2: not matched

  • Ma ciò che questo? Da dove viene il secondo 4? Controlla lo schema "di gruppo", perché il primo esempio corrisponde, ma il secondo no. Ma raddoppia l'ultimo valore trovato invece di salvare nuovo. Perché? Forse ho dimenticato di accendere alcune bandiere?
  • E c'è un altro modo per ottenere in un gruppo dati da parte diversa dell'espressione regolare?

devo più di un gruppo, in modo da token_iterator non mi può aiutare.

e di espressione dovrebbe essere configurato nel file di configurazione. statico Xpressive non può essere utilizzato.

+1

No, non si può farcire due parti diverse di una stringa di destinazione in un unico gruppo di cattura - almeno non senza catturare anche tutto tra. –

risposta

0

Questo è come io interpreto il tuo problema:

String: Total price: $1,234

e si desidera catturare il costo come 1234 (senza virgola)

Questo non è possibile con la sola espressione regolare , poiché non c'è modo di catturare un gruppo ed escludere parti nel mezzo. Detto questo, è possibile utilizzare 2 gruppi partita e lookaheads, e poi dentro il codice cucire i gruppi insieme. Utilizzando l'esempio precedente, se non si sa se ci sarà una virgola oppure no (prezzo varia da 1-5000) si può fare qualcosa di simile a

Total price: \$(?P<price>\d{1,3})(?:(?=\,),(?P<price2>\d{3})|)

che corrisponde 1-3 cifre, quindi cercare una virgola, e se esiste, utilizzare un gruppo diverso nome e abbinare il secondo pezzo.

Ecco davvero una bella risorsa per le prove regex: www.regex101.com

+0

Certo, posso fare questo con il codice di aggiunta. Inoltre, con il codice aggiuntivo posso farlo senza regex affatto. Ma voglio salvare regex nel file di configurazione. Ma non è così facile creare tale codice, inoltre, che lavorerà con qualsiasi regex UNKNOWN. Non so quanti gruppi (prezzo, prezzo2, prezzo3 ...) ci saranno e in quale ordine – Darida

+0

@Darida sto lavorando su un caso simile ora. La mia soluzione attuale è che nel file di configurazione continuo non solo il modello di espressione regolare, ma anche "descrizione dei valori". Fondamentalmente è solo una sequenza di acquisizione di nomi di gruppi e stringhe arbitrarie. Il codice corrisponde alla stringa con il modello e, se ha successo, crea un valore effettivo basato su quella "descrizione del valore" che concatena i gruppi di acquisizione menzionati e ciò che viene specificato. Ciò consente una ragionevole flessibilità nel file di configurazione pur mantenendo un codice fisso. –