2015-09-20 14 views
5

Voglio un modello di espressione regolare per trovare un numero intero nella stringa, ma non galleggiare (con punto decimale come o "" Così, per stringa "":.regex: trovare intero ma non galleggiano

abc111.222dfg333hfg44 .55

si deve solo trovare:

ho creato schema di espressione regolare:

(?<!\\d[\\.,]|\\d)\\d+(?![\\.,]\\d+|\\d) 

ma non riesce quando si utilizza l'espressione regolare in C++ STL. Si getta eccezione:

Unhandled exception at at 0x76AF4598 in xxxxxx.exe: Microsoft C++ exception: std::regex_error at memory location 0x00C1F218. 

ma funziona bello in classe C# Regex

UPDATE:

My Code:

smatch intMatch; 
regex e1("(?<!\\d[\\.,]|\\d)\\d+(?![\\.,]\\d+|\\d)"); 
string s("111.222dfg333hfg44.55"); 
regex_search (s, intMatch, e1); 

ma genera un'eccezione in linea:

regex e1("(?<!\\d[\\.,]|\\d)\\d+(?![\\.,]\\d+|\\d)"); 

UPDATE 2:

Entrambe le risposte sono corrette, ma per C++ regex STL Toto si lavora meglio.

+1

Il problema risiede quasi sicuramente nel codice, ma non ne è stato mostrato nessuno, quindi è impossibile rispondere. –

+0

La sintassi di .NET Regular Expression è diversa dalle espressioni regolari STL. – Dai

+1

Onestamente, per un problema come quello che descrivi, un semplice parser di macchina dello stato "character-eater" sarebbe più veloce da scrivere e più facile da capire, e indubbiamente più veloce anche nell'esecuzione. – Dai

risposta

3

Non sono sicuro per C++ STL, ma molti sapori di espressioni regolari non supportano il lookbehind negativo di lunghezza variabile.

Nel tuo caso si può semplicemente fare:.

(?:^|[^.,\d])(\d+)(?:[^.,\d]|$) 
+0

Il lookbehind negativo dell'OP non è una lunghezza variabile –

+0

grazie per la risposta, ma il modello non restituisce ciò che voglio.Per l'esempio dalle mie domande trova: "c111", "222d", "g333h", "g44", "55", insted di "333" – user3057544

+0

@karthikmanchala: Sì lo è, sta cercando di far corrispondere una cifra o una punteggiatura + una cifra, quindi 1 o 2 caratteri. – Toto

1

Per quanto ci potrebbero essere molte differenze di sapori regex utilizzati nelle diverse lingue/versioni/etc, vorrei provare a gestire questo problema con le funzioni di base regex, supportato dalla maggior parte delle versioni, come:

\d+[,.]\d+|(\d+) 

DEMO

esso uso unica alternativa e la cattura di gruppo, non lookarounds. Gli interi sono catturati nel 1 ° gruppo.

0

In primo luogo, è necessario sapere che all'interno di un gruppo di caratteri come in [] non è necessario sfuggire ai metacaratteri, quindi al posto di [\\.,] è necessario scrivere [.,]. Ho provato il seguente programma e sembra trovare le corrispondenze corrette

std::string in = "abc111.222dfg333hfg44.55"; 

boost::regex re("(?<!(\\d[.,]|.\\d))\\d+(?![.,\\d])"); 

boost::sregex_iterator it(in.begin(), in.end(), re); 
boost::sregex_iterator end; 

for(;it!=end; ++it) 
{ 
    boost::smatch s = *it; 
    std::cout << s[0] << std::endl; 
} 
Problemi correlati