2010-09-13 17 views
10

Necesito una expresión regular que extraen el texto dentro de un delimitador pero estoy tener un problema de extraer el valor dentro del delimitador [DATA n] y [DATOS FIN]texto partido RegEx entre delimitadores

Aquí es mi expresión regular

(?<=\[DATA\s+\d+\]).*(?=\[END DATA\]) 

aquí es ejemplo de datos que quiero para que coincida con

Algunos texto aquí

[DATA 1] 
data one 
some more data 
[END DATA] 
[DATA 2] 
data two 
more data 
data 
[END DATA] 
[DATA n] 
more data 
data 
[END DATA] 

Respuesta

20

Parece que está usando expresiones regulares características como la búsqueda hacia atrás y la búsqueda hacia delante cuando realmente no los necesita. Proveedores:

\[DATA\s+\d+\](.*?)\[END DATA\] 

Sólo hay un grupo de captura en esta expresión regular, (.*?). Después de usar esto, el resultado que busca debe estar en el grupo de captura 1.

Tenga en cuenta también que he utilizado la no expansivo .*? partido que coincidirá hasta la primera siguiente instancia de [END DATA]. Sin esto, si usa solo .*, capturará todo hasta el último[END DATA].

5

En la expresión regular, [ el texto entre ] se denomina clase de caracteres, y los motores regex solo coincidirán con uno de los caracteres entre los corchetes. Sólo tiene que poner las barras invertidas para hacerlos literal:

(?<=\[DATA\s+\d+\]).*(?=\[END DATA\]) 
+0

lo siento, edité mi publicación, debería contener los paréntesis \. Gracias. pero aún no extrae los datos dentro del delimitador, por cierto estoy usando expreso – dynamicvoid

+0

Esto funcionó muy bien para mí (? <= \ [). * (? = \]) para texto como: [TEXTO] – tkrn

+0

Esta solución no funciona parece que funciona –

1

Use el carácter \ para escapar.

\[DATA\s\d\]+([^\[]+)\[[^\]]+\] 
4

El carácter especial de punto no coincide con las líneas nuevas de forma predeterminada. Asegúrese de que está utilizando modificador sola línea para su implementación de expresiones regulares, o utilizar [\S\s]*? en lugar de .*?

Ver http://www.regular-expressions.info/modifiers.html y http://www.regular-expressions.info/dot.html para más detalles.

+0

Mejor especificar el modificador de línea única en línea usando '(? S)' al frente. –

+0

Sí, definitivamente es una opción. Sin embargo, no creo que sea compatible con todas las implementaciones de expresiones regulares. Hasta donde yo sé, Javascript no admite esa sintaxis. La pregunta no es específica, así que simplemente sugerí algo que debería funcionar en la mayoría (si no en todos) los casos. –

+0

Quiero extraer todos los datos dentro del delimitador y debe ser multilínea, sí, estoy de acuerdo. *? no es aplicable – dynamicvoid

Cuestiones relacionadas