expresión regular:Para extraer una subcadena entre dos etiquetas en una cadena

StackOverflow https://stackoverflow.com/questions/1237

  •  08-06-2019
  •  | 
  •  

Pregunta

Tengo un archivo en el siguiente formato:

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

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

¿Fue útil?

Solución

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

Es de esperar que esto deje caer el [start] y [end] marcadores también.

Otros consejos

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

Esto colocará el texto en el medio dentro de una captura.

$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 decirles que este método funciona...

Puede encontrar una discusión más completa sobre los peligros del uso de 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 anidadas realmente necesitan un analizador completo para poder interpretarse correctamente.

Tenga en cuenta que será necesario desactivar la distinción entre mayúsculas y minúsculas para poder responder la pregunta como se indica.En Perl, ese es el i modificador:

$ 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 utilizar el *? cuantificador que apaga la avidez de la coincidencia capturada.Por ejemplo, si tiene un no coincidente [fin] etiqueta:

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

probablemente no quieras capturar:

 Data i want [End] Data

Si bien puede usar una expresión regular para analizar los datos entre las etiquetas de apertura y cierre, debe pensar detenidamente si este es el camino que desea seguir.La razón es la posibilidad de que las etiquetas se anidan:Si alguna vez se pudieran anidar etiquetas, 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 PCRE o las expresiones regulares de Perl, admiten el retroceso, que se puede utilizar para lograr este efecto aproximado.Pero PCRE (a diferencia de Perl) no admite retroceso ilimitado, y esto puede causar que las cosas se rompan de maneras extrañas tan pronto como tenga demasiadas etiquetas.

Hay una publicación de blog muy citada que analiza esto con más detalle, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (búsquelo en Google y verifique el caché actualmente, parece que están teniendo un tiempo de inactividad)

Bueno, si garantizas que cada etiqueta de inicio va seguida de una etiqueta de cierre, entonces lo siguiente funcionaría.

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

Sin embargo, si tiene texto complejo como el siguiente:

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

entonces tendrías problemas con las expresiones regulares.

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

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

En el caso anterior podemos garantizar que no habrá casos anidados de:

'<a></a>'

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

Con Perl puede rodear los datos que desee con () 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
}

Consulte esta pregunta para extraer texto entre etiquetas con espacios y puntos (.)

[\S\s] es el que usé

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

Leer el texto entre corchetes [], es decir, [Inicio] y [Fin] 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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top