Regex: para sacar una subcadena entre dos etiquetas en una cadena

votos
42

Tengo un archivo en el siguiente formato:

Datos de datos
Datos
[Comienzo]
Datos que quiero
[Fin]
Datos

Me gustaría tomar el Data I wantde entre las etiquetas [Start]y [End]usando una Regex. ¿Alguien puede mostrarme cómo se puede hacer esto?

Publicado el 04/08/2008 a las 14:47
fuente por usuario
En otros idiomas...                            


9 respuestas

votos
63
\[start\](.*?)\[end\]

Zhich pondrá el texto en el medio dentro de una captura.

Respondida el 04/08/2008 a las 14:52
fuente por usuario

votos
22

\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]

Esto debería caer el [start]y [end]marcadores también.

Respondida el 04/08/2008 a las 14:55
fuente por usuario

votos
5
$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;

Tenía un problema similar durante un tiempo y te puedo decir que este método funciona ...

Respondida el 06/10/2012 a las 17:52
fuente por usuario

votos
4

Si bien puede usar una expresión regular para analizar los datos entre las etiquetas de apertura y cierre, necesita pensar detenidamente si esta es una ruta que desea bajar. La razón de esto es el potencial de las etiquetas para anidar: si las etiquetas de anidación podrían ocurrir alguna vez, el lenguaje ya no es regular y las expresiones regulares dejan de ser la herramienta adecuada para analizarlo.

Muchas implementaciones de expresiones regulares, como PCRE o las expresiones regulares de perl, admiten el rastreo posterior que se puede utilizar para lograr este efecto aproximado. Pero PCRE (a diferencia de perl) no es compatible con backtracking ilimitado, y esto puede hacer que las cosas se rompan de manera extraña tan pronto como tenga demasiadas etiquetas.

Hay una publicación de blog muy comúnmente citada que analiza esto más, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (google para ello y verifique la caché actualmente, parece que están teniendo algún tiempo de inactividad)

Respondida el 15/09/2008 a las 15:18
fuente por usuario

votos
4

Se puede encontrar una discusión más completa sobre los peligros de usar una expresión regular para encontrar etiquetas coincidentes en: http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi . En particular, tenga en cuenta que las etiquetas de anidamiento realmente necesitan un analizador completo para poder interpretarlo correctamente.

Tenga en cuenta que la sensibilidad de mayúsculas y minúsculas deberá desactivarse para responder a la pregunta tal como se establece. En perl, ese es el modificador i :

$ echo "Data Data Data [Start] Data i want [End] Data" \
  | perl -ne '/\[start\](.*?)\[end\]/i; print "$1\n"'
 Data i want 

El otro truco es usar el *? cuantificador que desactiva la codicia de la pareja capturada. Por ejemplo, si tiene una etiqueta [final] no coincidente :

Data Data [Start] Data i want [End] Data [end]

probablemente no quieras capturar:

 Data i want [End] Data
Respondida el 20/08/2008 a las 20:14
fuente por usuario

votos
3

Bueno, si usted garantiza que cada etiqueta de inicio va seguida de una etiqueta final, entonces lo siguiente funcionaría.

\[start\](.*?)\[end\]

Sin embargo, si tiene texto complejo como el siguiente:

[start] sometext [start] sometext2 [end] sometext [end]

entonces se encontraría con problemas con Regex.

Ahora el siguiente ejemplo extraerá todos los enlaces activos en una página:

'/<a(.*?)a>/i'

En el caso anterior, podemos garantizar que no habrá ningún caso anidado de:

'<a></a>'

Entonces, esta es una pregunta compleja y no se puede resolver simplemente con una respuesta simple.

Respondida el 11/05/2009 a las 21:08
fuente por usuario

votos
1

Con Perl puede rodear los datos que desee con () y extraerlos más tarde, quizás otros idiomas tengan una función similar.

if ($s_output =~ /(data data data data START(data data data)END (data data)/) 
{
    $dataAllOfIt = $1;      # 1 full string
    $dataInMiddle = $2;     # 2 Middle Data
    $dataAtEnd = $3;        # 3 End Data
}
Respondida el 04/08/2008 a las 15:00
fuente por usuario

votos
0

La lectura del texto con en los corchetes [] es decir [Inicio] y [End] y validar la matriz con una lista de valores. jsFiddle http://jsfiddle.net/muralinarisetty/r4s4wxj4/1/

var mergeFields = ["[sitename]",
                   "[daystoholdquote]",
                   "[expires]",
                   "[firstname]",
                   "[lastname]",
                   "[sitephonenumber]",
                   "[hoh_firstname]",
                   "[hoh_lastname]"];       

var str = "fee [sitename] [firstname] \
sdfasd [lastname] ";
var res = validateMeargeFileds(str);
console.log(res);

function validateMeargeFileds(input) {
    var re = /\[\w+]/ig;
    var isValid;
    var myArray = input.match(re);

    try{
        if (myArray.length > 0) {
            myArray.forEach(function (field) {

                isValid = isMergeField(field);

                if (!isValid){
                   throw e;                        
                }
            });
        }
    }
    catch(e) {        
    }

    return isValid;
}

function isMergeField(mergefield) {
    return mergeFields.indexOf(mergefield.toLowerCase()) > -1;
}
Respondida el 12/09/2014 a las 09:26
fuente por usuario

votos
0

Referirse a esta pregunta para sacar el texto entre las etiquetas con caracteres de espacio y puntos ( .)

[\S\s] es el que solía

Expresiones regulares para que coincida con cualquier carácter incluyendo nuevas líneas

Respondida el 28/08/2013 a las 22:12
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more