2012-08-14 8 views
11

Me gustaría hacer coincidir todas las líneas que comienzan con una palabra dada, digamos iheap. Si no me equivoco, la expresión regular (en sintaxis de ECMAScript) "^iheap.*" debería ser la solución. Sin embargo, cuando probé esto en C++ 11 usando la biblioteca de expresiones regulares de libC++, solo la primera línea coincide. Por lo tanto, "^..." parece coincidir solo con el inicio de la entrada en lugar del principio de la línea.Coincidencia de "principio de línea" con libC++ biblioteca de expresiones regulares (C++ 11)

Aquí se muestra un ejemplo:

#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; 
} 

Salida:

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

Es esto un error de libC++ o algo mal lo estoy haciendo? ¡Gracias!

Nota: Estoy utilizando Mac OS X Mountain Lion y Apple LLVM Compiler 4.0 (básicamente una instantánea de clang 3.1 SVN).

+0

acaba de tropezar con este problema ... fyi, boost :: regex (en modo EMCAScript) coincide con el principio de línea, es decir, su expresión regular funcionaría. – fscan

+0

Hrmm, solo ligeramente relacionado, pero '$' no coincide con '\ r \ n' en VS2013 - se necesita' \ s * $ 'o similar para que coincida ... – Cameron

Respuesta

5

He revisado todos los estándares relevantes, y hasta donde puedo decir,^solo coincide con el comienzo de la cadena, y no con una nueva línea, a menos que el motor esté en el modo multiline. El motor predeterminado es ECMA-262 El motor no está en modo multilínea por defecto, y no veo forma de ponerlo en modo multilínea utilizando la interfaz estándar de C++.

Dicho todo esto, si alguien puede indicarme un texto normativo que diga algo diferente, consideraré que se trata de un informe de error y haré todo lo posible para solucionarlo.

+1

Solo por una risita, intente esto: '(? m)^iheap. *'. ECMA-262 no especifica modificadores en línea, pero 'libC++' podría soportarlos de todos modos. Esta no sería la única implementación de expresiones regulares de ECMAScript para agregar unilateralmente soporte para funciones no cubiertas en la especificación. –

+0

@ AlanMoore: Acabo de probarlo, se lanza una excepción. Lamentablemente, parece que no están apoyando esa extensión. – iheap

+2

Hola Howard. Tampoco pude encontrar un texto normativo que resuelva la cuestión, pero creo que tengo una justificación lo suficientemente fuerte como para implicar que el modo predeterminado debe ser multilínea. Existe el indicador 'std :: regex_constants :: match_not_bol' cuya función es asegurarse de que la aserción' "^" 'no coincida con el comienzo de la entrada. Con esa bandera en el modo multilínea; la aserción '"^"' coincidirá con todas las líneas excepto la primera línea. En el modo de línea única, esa bandera hará que la aserción '"^"' no funcione, lo cual no tiene sentido para mí. – iheap

Cuestiones relacionadas