elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Regex.Matches() error de uso C#
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Regex.Matches() error de uso C#  (Leído 2,144 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Regex.Matches() error de uso C#
« en: 21 Febrero 2016, 18:22 pm »

Hola,

Código
  1. Regex r = new Regex("<div class=\"logo\">.*<a href=\".*\"");
  2.  
  3.                foreach (Match m in r.Matches(responseData))
  4.                {
  5.                    MessageBox.Show(m.Value);
  6.                }
  7.  

No encuentra coincidencias (matches), sin embargo hay varias. ¿que le falla a la expresión?.

Le digo que empiece en <div class=\"logo\"> que continue independientemente de lo que haya hasta llegar a <a href=\" y que siga hasta llegar a la siguiente doble comilla.

HTML de la página:

Código
  1. div class="logo">
  2.                                <a href="/randomlink/here/"
  3.  

No entra siquiera en el bucle, 0 matches found.

Saludos, gracias.



« Última modificación: 21 Febrero 2016, 19:00 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.708



Ver Perfil
Re: Regex.Matches() error de uso C#
« Respuesta #1 en: 21 Febrero 2016, 19:11 pm »

Te falta especificar las opciones o flags adecuadas:
Código
  1. Regex r = new Regex("<div class=\"logo\">.*<a href=\".*\"", RegexOptions.Singleline | RegexOptions.IgnoreCase);




Aparte de eso, en el código html que has publicado falta el símbolo de apertura < al principio para que funcione, pero imagino que es un error que has tenido al copiar y pegar del código original.

Saludos


« Última modificación: 21 Febrero 2016, 19:27 pm por Eleкtro » En línea


Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Regex.Matches() error de uso C#
« Respuesta #2 en: 21 Febrero 2016, 19:36 pm »

Te falta especificar las opciones o flags adecuadas:
Código
  1. Regex r = new Regex("<div class=\"logo\">.*<a href=\".*\"", RegexOptions.Singleline | RegexOptions.IgnoreCase);

Buenas socio, gracias por la respuesta. El parametro SingleLine solo detiene el match hasta el primer \n eso no es lo que interesa, porque de hecho en el match creo que aparece un \n entre <div class=\"logo\"> y <a href=... por eso puse el .* por si había tabuladores \n etc.

Pero vamos muy raro, debería de salir sin poner nada, y probando con lo tuyo obtengo casi todo el HTML.. seguiré probando. De todas formas con lo de single lane si que sale algo, porque si no pones nada no sale nada :P.

PD: y sí era un error de corta pega.

Saludos.

Edito: También  pasa una cosa muy rara, la respuesta que recibo del servidor la intento mostrar en Messagebox.Show() y no sale nada, sin embargo tiene contenido cuando depuro, también me pasa con los matches que trato de mostrar las subcadenas que encuentra y no las muestra con MB, sin embargo las voy almacenando en una String que muestro al final y esa si que funciona un poco raro vaya. :xD :xD :xD

La idea es que saque todos los links del HTML que cumplan esas condiciones, con las flags SingleLine y IgnoreCase me sale esta salida:

Citar
<div class="logo">
                                <a href="/link/qa/"
                                   title="titulo"
                                   data-mixpanel="panel">
                                    <img src="...............

Se debería detener en la segunda línea y buscar otros 40 links que debe de haber en la página.

La clave está en probar en esta página: https://regex101.com/r/vN3sH3/41

Solo me interesa "/link/qa".

Es por el salto de linea, no se como seguir matcheando después de el. Si están en la misma línea si que funcionaría el div y el href pero no es el caso.
« Última modificación: 21 Febrero 2016, 20:59 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.708



Ver Perfil
Re: Regex.Matches() error de uso C#
« Respuesta #3 en: 21 Febrero 2016, 22:22 pm »

Es por el salto de linea, no se como seguir matcheando después de el.

En el comentario anterior te he indicado como hacerlo... con el flag SingleLine.



El parametro SingleLine solo detiene el match hasta el primer \n eso no es lo que interesa

Hace todo lo opuesto, lee bien su funcionalidad.

.* con SingleLine = Cero o más caracteres, incluyendo saltos de linea (\n).



La clave está en probar en esta página: https://regex101.com/r/vN3sH3/41

Ten en cuenta que estás bajo C#, y hay muchas cosas que son diferentes en el modo de empleo. Usar un evaluador de expresiones regulares ligado a las limitaciones y la sintaxis del motor RegEx de javascript, no es la clave de nada.

Si quieres evaluar expresiones para .Net, usa un servicio online para esa finalidad... aunque yo personalmente te sugiero la aplicación de escritorio RegexBuddy, y para construir expresiones, RegexMagic.



la respuesta que recibo del servidor la intento mostrar en Messagebox.Show() y no sale nada, sin embargo tiene contenido cuando depuro

Pues muestra el código y la url para intentar hallar el error...

Volviendo al tema, deberías preguntar desde el principio por lo que realmente quieres lograr, ¿quieres obtener el valor de los href?, ¿es eso?, ¿entonces por que intentas capturar toda la linea?.

Puedes hacerlo de la siguiente manera:
Código
  1. string html = File.ReadAllText("C:\\file.html");
  2. Regex expr = new Regex("href=\"(?<url>.+)\"", RegexOptions.Multiline);
  3.  
  4. Console.WriteLine(expr.IsMatch(html));
  5.  
  6. foreach (Match m in expr.Matches(html)) {
  7. Console.WriteLine(m.Groups("url").Value);
  8. }

o bien...:
Código
  1. string html = File.ReadAllText("C:\\file.html");
  2. Regex expr = new Regex("div class=\"logo\".+(?:(\n){1})?.+href=\"(?<url>.+)\".+$",
  3.                       RegexOptions.Multiline | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase);
  4.  
  5. Console.WriteLine(expr.IsMatch(html));
  6.  
  7. foreach (Match m in expr.Matches(html)) {
  8. Console.WriteLine(m.Groups("url").Value);
  9. }

PD: De todas te sugiero evitar la utilización de RegEx para intentar parsear estructuras Html, ya que no se inventó para ese fin. Mi consejo, utiliza HtmlAgilityPack, es mucho más sencillo y eficiente.

Saludos
« Última modificación: 21 Febrero 2016, 22:44 pm por Eleкtro » En línea


Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Regex.Matches() error de uso C#
« Respuesta #4 en: 21 Febrero 2016, 23:18 pm »

Buenas elektro, gracias por la respuesta.

Al final ya lo conseguí resolver:

Código
  1. "<div class=\"logo\">(\n\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s)<a href=\".*?\""
  2.  

Al final he aprendido un poco a usar los regex aunque seguro se puede simplificar eso XD, supongo que habrá algo para que ignore.. mañana lo miraré con más tiempo.

Respecto a lo de Singleline entendí mal lo que hacía entonces XD.

Al final con la página conseguí hacerlo funcionó como lo esperado al menos esta vez, de todas maneras gracias por las alternativas las echaré un vistazo por el tema de eficiencia y demás, y probaré tu código socio, muchas gracias y un saludo.
« Última modificación: 21 Febrero 2016, 23:20 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.708



Ver Perfil
Re: Regex.Matches() error de uso C#
« Respuesta #5 en: 22 Febrero 2016, 00:05 am »

Al final ya lo conseguí resolver:
Código
  1. "<div class=\"logo\">(\n\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s)<a href=\".*?\""
  2.  

( \s+ )

¿No te sirve la segunda expresión que te mostré?, a mi me funciona como estaba previsto, pero claro... el código fuente de tu html puede que cambiar al mio :-/

Bueno, aunque quede repetitivo lo conseguiste, me alegro.

Saludos!
« Última modificación: 22 Febrero 2016, 00:09 am por Eleкtro » En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
RegEx
.NET (C#, VB.NET, ASP)
CH4ØZ 5 3,920 Último mensaje 16 Septiembre 2011, 00:21 am
por CH4ØZ
duda de regex
.NET (C#, VB.NET, ASP)
spiritdead 3 1,492 Último mensaje 29 Diciembre 2012, 07:26 am
por spiritdead
[SOURCE] RegEx .NET
.NET (C#, VB.NET, ASP)
Eleкtro 3 2,029 Último mensaje 11 Septiembre 2013, 16:53 pm
por Eleкtro
Regex en una dll
Programación C/C++
patilanz 1 781 Último mensaje 25 Febrero 2015, 01:51 am
por patilanz
Matches para palabras o silabas
Java
SrTrp 6 1,141 Último mensaje 10 Febrero 2019, 23:43 pm
por Serapis
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines