Regex: Para extraer una sub-cadena entre dos etiquetas en una cadena


Tengo un archivo en el siguiente formato:

Data Data
Data
[Start]
Data I want
[End]
Data

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

Author: Aditi Parikh, 2008-08-04

9 answers

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

Esto esperanzadamente debería eliminar los marcadores [start] y [end] también.

 23
Author: Xenph Yan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-18 13:35:58
\[start\](.*?)\[end\]

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

 64
Author: Karl Seguin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-18 13:36:20
$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;

Tuve un problema similar por un tiempo y puedo decirte que este método funciona...

 6
Author: PhaZe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-06 16:52:08

Una discusión más completa de las trampas de usar una expresión regular para encontrar etiquetas coincidentes se puede encontrar 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 sintáctico completo para ser interpretadas correctamente.

Tenga en cuenta que la sensibilidad de mayúsculas y minúsculas deberá desactivarse para responder a la pregunta como se ha indicado. 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 partida capturada. Por ejemplo, si tiene una etiqueta [end] no coincidente:

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

Probablemente no quieras capturar:

 Data i want [End] Data
 5
Author: Jon Ericson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-20 19:14:19

Si bien puede usar una expresión regular para analizar los datos entre las etiquetas de apertura y cierre, debe pensar detenidamente si esta es una ruta que desea recorrer. La razón de esto es el potencial de las etiquetas para anidar: si las etiquetas de anidamiento pueden suceder o pueden suceder, se dice que el lenguaje ya no es regular, y las expresiones regulares dejan de ser la herramienta adecuada para analizarlo.

Muchas implementaciones de expresiones regulares, como las expresiones regulares de PCRE o perl, apoye el retroceso que se puede utilizar para alcanzar este efecto áspero. Pero PCRE (a diferencia de perl) no admite backtracking ilimitado, y esto en realidad puede causar que las cosas se rompan de maneras extrañas tan pronto como tenga demasiadas etiquetas.

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

 4
Author: Daniel Papasian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 14:18:27

Bueno, si garantiza que cada etiqueta de inicio es seguida por una etiqueta de fin, 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 calientes en una página:

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

En el caso anterior podemos garantizar que no habría ningún caso anidado de:

'<a></a>'

Por lo tanto, esta es una pregunta compleja y no solo se puede resolver con una respuesta simple.

 3
Author: un33k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-11 20:08:30

Con Perl puede rodear los datos que desee con ()'s y extraerlos más tarde, tal vez otros lenguajes tengan una característica 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
}
 1
Author: Grant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-12 12:21:25

Refiérase a esta pregunta para extraer texto entre etiquetas con caracteres de espacio y puntos (.)

[\S\s] es el que usé

Regex para que coincida con cualquier carácter, incluidas las nuevas líneas

 0
Author: ankitkpd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:46:54

Leyendo el texto entre corchetes [] es decir[Start] y [End] y validando el array 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;
}
 0
Author: N Murali Mohan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-07 00:38:48