entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Eliminar texto con ayuda de expresión regular

Hola.

Estoy parseando un xml en java. Dentro de la etiqueta description me encuentro con texto (código en javascript) que desearía eliminar. PAra ello, imagino que lo mejor es usar expresiones regulares. Estoy siguiendo esta guía pero no termino de entenderlo bien.

Yo tengo el siguiente código:

<h1>Martxoak 29: Altza eta Yoldiko igerilekuetan itxiera partzialak</h1> <h3></h3> <p> <p id="aui_3_4_0_1_331" style="margin-bottom: 0px; padding-bottom: 0.5em; line-height: 1.6em; color: rgb(85, 85, 85); font-family: Arial, Verdana, Geneva, Helvetica, sans-serif; font-size: 14px; background-color: rgb(241, 241, 241);"> <strong id="aui_3_4_0_1_347">Altza kiroldegia</strong><br /> Igeriketa txapelketa eta waterpolo partidak izango direla eta, datorren martxoaren 29an, larunbatean, ALTZA kiroldegiko igerilekua 14:30etatik aurrera itxiko da.<br /> <br /> <strong>Paco Yoldi (Anoeta)</strong><br /> Zenbait waterpolo partida direla eta, datorren larunbatean, martxoak 29, PACO YOLDI kiroldegiko 50m-ko igerilekua 18:30etatik aurrera itxita egongo da.</p> <p style="margin-bottom: 0px; padding-bottom: 0.5em; line-height: 1.6em; color: rgb(85, 85, 85); font-family: Arial, Verdana, Geneva, Helvetica, sans-serif; font-size: 14px; background-color: rgb(241, 241, 241);"> <br /> <strong>Oharra: 25m-ko igerilekua irekita egongo da.</strong></p> </p> **<!-- COMIENZO CONTAINER SOCIAL -->** <div id="container_social"> <div class="google"> <!-- Place this tag where you want the +1 button to render. --> <div class="g-plusone"></div>   </div> <div class="twitter"> <a href="https://twitter.com/share" class="twitter-share-button" data-lang="eu">Twittear</a> </div> <div class="facebook"> <!-- Place the code for your plugin wherever you want the plugin to appear on your page. --> <div class="fb-like" data-send="false" data-layout="button_count" data-width="450" data-show-faces="true"></div> </div> <!--<div class="tuenti"> <a href="http://www.tuenti.com/share" id="tuenti_share" class="tuenti-share-button" icon-style="dark" language="eu-ES"></a> </div> --> </div> <!-- Place this tag after the last +1 button tag. --> <script type="text/javascript"> window.___gcfg = {lang: 'eu'}; (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })(); </script> <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs"); </script> <!-- Include the JavaScript SDK on your page once, ideally right after the opening <body> tag. --> <div id="fb-root"></div> <script>(function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = "//connect.facebook.net/eu_ES/all.js#xfbml=1"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk')); </script> <script type="text/javascript" src="http://widgets.tuenti.com/widgets.js"></script> **<!-- FIN CONTAINER SOCIAL -->**

Me gustaría eliminar todo el contenido entre <!-- COMIENZO CONTAINER SOCIAL --> y <!-- FIN CONTAINER SOCIAL -->.

Alguien puede ayudarme?

Gracias y saludos!

2 Respuestas

1voto

carlossevi Puntos63580

La expresión regular para buscar la parte que quieres sería:

<!-- COMIENZO CONTAINER SOCIAL -->.*<!-- FIN CONTAINER SOCIAL -->

Puedes validarla aquí. La explicación: busca cadenas que comiencen con el comentario de "COMIENZO", estén continuadas por cero o más caracteres cualquiera y terminen con el de "FIN". Cuidado porque aquí no se contemplarían saltos de línea (en tu ejemplo no los hay).

Una vez validada la expresión regular deberías poder utilizar el método replaceAll de la clase string de Java o el Matcher de las expresiones regulares:

 Pattern.compile(regex).matcher(str).replaceAll(repl)

Donde:

  • regex es la expresión regular (la cadena que he puesto arriba).
  • str es la variable que contiene tu texto.
  • repl es el texto a reemplazar, en tu caso sería una cadena vacía.

0voto

egoitz_gonzalez comentado

Hola.

Parece que no me funciona. Puede que sea por lo que comentas de que no se contemplan saltos de linea?
El código que uso es el siguiente:

    String description = obj.getDescription();
    String regex = "<!-- COMIENZO CONTAINER SOCIAL -->.*<!-- FIN CONTAINER SOCIAL -->";
    String repl = "";
    String des = Pattern.compile(regex).matcher(description).replaceAll(repl);

Cuando hago un log para ver el contenido de la variable recibo lo siguiente:

04-03 16:17:27.848: E/Aviso(15485): descriptionLimpio: <h1>Martxoak 15: Altza eta Yoldiko igerilekuetan itxiera partzialak</h1>
04-03 16:17:27.848: E/Aviso(15485): <h3></h3>
04-03 16:17:27.848: E/Aviso(15485): <p> <p>
04-03 16:17:27.848: E/Aviso(15485):     <strong>Altza kiroldegia</strong><br>
04-03 16:17:27.848: E/Aviso(15485):     Waterpolo partidak izango direla eta, datorren martxoaren 15ean, larunbatean, ALTZA kiroldegiko igerilekua 19:30etatik aurrera itxiko da.</p>
04-03 16:17:27.848: E/Aviso(15485): <p>
04-03 16:17:27.848: E/Aviso(15485):      </p>
04-03 16:17:27.848: E/Aviso(15485): <p>
04-03 16:17:27.848: E/Aviso(15485):     <strong>Paco Yoldi (Anoeta)</strong><br>
04-03 16:17:27.848: E/Aviso(15485):     Waterpolo partidak izango direla eta, datorren larunbatean, martxoak 15, PACO YOLDI kiroldegiko 50m-ko igerilekua 18:30etatik aurrera itxiko da.</p>
04-03 16:17:27.848: E/Aviso(15485): <p>
04-03 16:17:27.848: E/Aviso(15485):     <strong style="line-height: 1.4;">Oharra: 25m-ko igerilekua irekita egongo da.</strong></p>
04-03 16:17:27.848: E/Aviso(15485): </p>
04-03 16:17:27.848: E/Aviso(15485):  
04-03 16:17:27.848: E/Aviso(15485): <div id="container_social">
04-03 16:17:27.848: E/Aviso(15485):     <div class="google">
04-03 16:17:27.848: E/Aviso(15485):          
04-03 16:17:27.848: E/Aviso(15485):         <div class="g-plusone"></div>   
04-03 16:17:27.848: E/Aviso(15485):     </div>
04-03 16:17:27.848: E/Aviso(15485):     <div class="twitter">
04-03 16:17:27.848: E/Aviso(15485):         <a href="https://twitter.com/share" class="twitter-share-button" data-lang="eu">Twittear</a>
04-03 16:17:27.848: E/Aviso(15485):     </div>
04-03 16:17:27.848: E/Aviso(15485):     <div class="facebook">
04-03 16:17:27.848: E/Aviso(15485):          
04-03 16:17:27.848: E/Aviso(15485):         <div class="fb-like" data-send="false" data-layout="button_count" data-width="450" data-show-faces="true"></div>
04-03 16:17:27.848: E/Aviso(15485):     </div>
04-03 16:17:27.848: E/Aviso(15485):      
04-03 16:17:27.848: E/Aviso(15485): </div>
04-03 16:17:27.848: E/Aviso(15485):  
04-03 16:17:27.848: E/Aviso(15485): <script type="text/javascript">
04-03 16:17:27.848: E/Aviso(15485):   window.___gcfg = {lang: 'eu'};
04-03 16:17:27.848: E/Aviso(15485):   (function() {
04-03 16:17:27.848: E/Aviso(15485):     var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
04-03 16:17:27.848: E/Aviso(15485):     po.src = 'https://apis.google.com/js/plusone.js';
04-03 16:17:27.848: E/Aviso(15485):     var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
04-03 16:17:27.848: E/Aviso(15485):   })();
04-03 16:17:27.848: E/Aviso(15485): </script>
04-03 16:17:27.848: E/Aviso(15485): <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");
04-03 16:17:27.848: E/Aviso(15485): </script>
04-03 16:17:27.848: E/Aviso(15485):  
04-03 16:17:27.848: E/Aviso(15485): <div id="fb-root"></div>
04-03 16:17:27.848: E/Aviso(15485): <script>(function(d, s, id) {
04-03 16:17:27.848: E/Aviso(15485):   var js, fjs = d.getElementsByTagName(s)[0];
04-03 16:17:27.848: E/Aviso(15485):   if (d.getElementById(id)) return;
04-03 16:17:27.848: E/Aviso(15485):   js = d.createElement(s); js.id = id;
04-03 16:17:27.848: E/Aviso(15485):   js.src = "//connect.facebook.net/eu_ES/all.js#xfbml=1";
04-03 16:17:27.848: E/Aviso(15485):   fjs.parentNode.insertBefore(js, fjs);
04-03 16:17:27.848: E/Aviso(15485): }(document, 'script', 'facebook-jssdk'));
04-03 16:17:27.848: E/Aviso(15485): </script>
04-03 16:17:27.848: E/Aviso(15485): <script type="text/javascript" src="http://widgets.tuenti.com/widgets.js"></script>
04-03 16:17:27.848: E/Aviso(15485):  

0voto

carlossevi comentado

Según esa salida tiene toda la pinta de que tu variable description está llena de saltos de línea y mi expresión regular no estaba preparada para ello =)

Prueba con la siguiente:

<!-- COMIENZO CONTAINER SOCIAL -->(.|\s)*<!-- FIN CONTAINER SOCIAL -->

De todas formas te sigo recomendando esta página para que tu mismo hagas pruebas y enredes validando combinaciones.

0voto

egoitz_gonzalez comentado

Gracias.

Ahora sí funciona. deduzco que | es un or y \s significa salto de linea verdad? es para entender un poco lo que hago y para aprender.

Por otra parte. Para que el código funcione en java y no recibir el error "Invalid escape sequence" se debe de colocar un \ antes de la propia . con lo cual el código queda de la siguiente manera:

String regex = " (.|\\s)* ";

http://stackoverflow.com/questions/16178955/invalid-escape-sequence-valid-ones-are-b-t-n-f-r

Saludos!

0voto

carlossevi comentado

Efectivamente el | significa "or" pero la \s no es sólo el salto de línea sino un "caracter es espacio en blanco" (en inglés whitespace character). Caracteres incluidos en esa definición: espacio, tabulación y salto de línea. El punto . significa cualquier caracter excepto saltos de línea, de ahí mi unión de los dos.

Es posible que haya una manera mejor de definir esta expresión regular ya que yo también estoy aprendiendo su uso y no lo domino.

2votos

xabe Puntos2180

Hola

Lo que te falta es pasar unos flags al Pattern que sería las siguientes:

String description = obj.getDescription();
    String regex = "<!-- COMIENZO CONTAINER SOCIAL -->.*<!-- FIN CONTAINER SOCIAL -->";
    String repl = "";
    Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
    String des = pattern.matcher(description).replaceAll(repl);

Saludos

0voto

egoitz_gonzalez comentado

Hola Xabe.

Gracias por la respuesta pero no me funciona.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta