2012-08-14 19 views
11

Vorrei abbinare tutte le righe che iniziano con una determinata parola, ad esempio iheap. Se non sbaglio, l'espressione regolare (nella sintassi ECMAScript) "^iheap.*" dovrebbe fare il trucco. Tuttavia, quando ho provato questo in C++ 11 usando la libreria regex di libC++, solo la prima riga è abbinata. Pertanto, "^..." sembra corrispondere solo all'inizio di input anziché all'inizio della riga.Corrispondenza "inizio riga" utilizzando libge ++ regex library (C++ 11)

Ecco un esempio:

#include <string> 
#include <regex> 
#include <iostream> 

using namespace std; 

int main() { 
     regex rx("^iheap.*"); 
     string s = "iheap says hello.\niheap says hello again.\n"; 
     cout << s << regex_replace(s, rx, "IHEAP"); 
     return 0; 
} 

uscita:

iheap says hello. 
iheap says hello again. 
IHEAP 
iheap says hello again. 

Questo è un bug di libC++ o sto facendo qualcosa di sbagliato? Grazie!

Nota: Sto usando Mac OS X Mountain Lion e Apple LLVM Compiler 4.0 (fondamentalmente un'istantanea di clang 3.1 SVN).

+0

appena inciampato su questo problema ... fyi, boost :: regex (in modalità EMCAScript) corrisponde all'inizio della linea, vale a dire la tua regex funzionerebbe. – fscan

+0

Hrmm, solo leggermente correlato, ma '$' non corrisponde a' \ r \ n' in VS2013 - ci vuole '\ s * $' o simile per corrispondere ... – Cameron

risposta

5

Ho esaminato tutti gli standard pertinenti e, per quanto posso dire,^corrisponde solo all'inizio della stringa e non a una nuova riga, a meno che il motore non sia in modalità multilinea. Il motore predefinito è ECMA-262 Il motore non è in modalità multilinea per impostazione predefinita e non vedo alcun modo per inserirlo in modalità multilinea utilizzando l'interfaccia standard di C++.

Tutto ciò che viene detto, se qualcuno può indicarmi un testo normativo che dice diversamente, lo considero un bug report e faccio del mio meglio per risolverlo.

+1

Solo per una risatina, prova questo: '(? m)^iheap. *'. ECMA-262 non specifica i modificatori in linea, ma 'libC++' potrebbe supportarli comunque. Questa non sarebbe l'unica implementazione regex di ECMAScript per aggiungere unilateralmente supporto per funzionalità non coperte dalle specifiche. –

+0

@AlanMoore: appena provato, viene lanciata un'eccezione. Sfortunatamente sembra che non stiano supportando questa estensione. – iheap

+2

Ciao Howard. Inoltre, non sono riuscito a trovare un testo normativo che risolva la questione, ma ritengo di avere una giustificazione abbastanza forte da implicare che la modalità predefinita debba essere multilinea. Esiste il flag 'std :: regex_constants :: match_not_bol' la cui funzione è di assicurarsi che l'asserzione' "^" 'non corrisponda all'inizio dell'input. Con quella bandiera nella modalità multilinea; l'asserzione "^" "corrisponderà a tutte le righe tranne la prima riga. Nella modalità single-line, quel flag renderà l'asserzione ''^"' non funzionale, che per me non ha senso. – iheap