¿Cómo usar expresiones regulares para analizar HTML en Java?

¿Puede alguien decirme una forma simple de encontrar las tags href y src en un archivo html usando expresiones regulares en Java?
Y luego, ¿cómo obtengo la URL asociada con la etiqueta?

Gracias por cualquier sugerencia.

Usar expresiones regulares para extraer valores de HTML siempre es un error. La syntax HTML es mucho más compleja de lo que parece en primer lugar y es muy fácil para una página atrapar incluso una expresión regular muy compleja.

Use un analizador HTML en su lugar. Ver también ¿Cuáles son los pros y los contras de los principales analizadores de HTML de Java?

Las otras respuestas son verdaderas Java Regex API no es una herramienta adecuada para lograr su objective. Use herramientas de alto nivel eficientes, seguras y bien probadas mencionadas en las otras respuestas.

Si su pregunta se refiere más bien a la API de Regex que a un problema de la vida real (por ejemplo, para fines de aprendizaje), puede hacerlo con el siguiente código:

String html = "foo bar baz qux foo"; Pattern p = Pattern.compile(""); Matcher m = p.matcher(html); while(m.find()) { System.out.println(m.group(0)); System.out.println(m.group(1)); } 

Y la salida es:

  https://stackoverflow.com/questions/677038/how-to-use-regular-expressions-to-parse-html-in-java/link1  https://stackoverflow.com/questions/677038/how-to-use-regular-expressions-to-parse-html-in-java/link2 

Tenga en cuenta que calificador perezoso / reacio *? debe usarse para reducir la agrupación a la etiqueta única. El grupo 0 es el partido completo, el grupo 1 es el siguiente partido del grupo (el siguiente par de paréntesis).

No use expresiones regulares use NekoHTML o TagSoup que son un puente que proporciona un SAX o DOM como en el enfoque XML para visitar un documento HTML.

Si desea ir por la ruta de análisis html, que Dave y yo recomendamos aquí es el código para analizar un String Data para tags de anclaje e imprimir su href.

ya que solo está usando tags de anclaje, debería estar bien solo con expresiones regulares, pero si quiere hacer más, vaya con un analizador. El analizador HTML de Mozilla es el mejor que hay.

 File parserLibraryFile = new File("lib/MozillaHtmlParser/native/bin/MozillaParser" + EnviromentController.getSharedLibraryExtension()); String parserLibrary = parserLibraryFile.getAbsolutePath(); // mozilla.dist.bin directory : final File mozillaDistBinDirectory = new File("lib/MozillaHtmlParser/mozilla.dist.bin."+ EnviromentController.getOperatingSystemName()); MozillaParser.init(parserLibrary,mozillaDistBinDirectory.getAbsolutePath()); MozillaParser parser = new MozillaParser(); Document domDocument = parser.parse(data); NodeList list = domDocument.getElementsByTagName("a"); for (int i = 0; i < list.getLength(); i++) { Node n = list.item(i); NamedNodeMap m = n.getAttributes(); if (m != null) { Node attrNode = m.getNamedItem("href"); if (attrNode != null) System.out.println(attrNode.getNodeValue()); 

Busqué en la Biblioteca de expresiones regulares ( http://regexlib.com/Search.aspx?k=href y http://regexlib.com/Search.aspx?k=src )

Lo mejor que encontré fue

 ((?(href|src)\s*=\s*")|(?url\())(?.*?)(?(html)"|\)) 

Vea estos enlaces para más expresiones:

http://regexlib.com/REDetails.aspx?regexp_id=2261

http://regexlib.com/REDetails.aspx?regexp_id=758

http://regexlib.com/REDetails.aspx?regexp_id=774

http://regexlib.com/REDetails.aspx?regexp_id=1437

Contrariamente a la opinión popular, las expresiones regulares son herramientas útiles para extraer datos del texto no estructurado (que es HTML).

Si está realizando una extracción compleja de datos HTML (por ejemplo, busca todos los párrafos en una página), entonces el análisis de HTML probablemente sea el camino a seguir. Pero si solo necesita obtener algunas URL de HREF, una expresión regular funcionaría bien y sería muy difícil romperla.

Pruebe algo como esto:

 /]+href=["']?([^'"> ]+)["']?[^>]*>/i 

Las expresiones regulares solo pueden analizar los idiomas regulares, por eso se llaman expresiones regulares . HTML no es un lenguaje normal, ergo no puede ser analizado por expresiones regulares.

Los analizadores HTML, por otro lado, pueden analizar HTML, por eso se llaman analizadores HTML.

Deberías usar tu analizador HTML favorito en su lugar.