Estoy tratando de usar el Daring Fireball Regular Expression for matching URLs en Java, y he encontrado una URL que hace que la evaluación dure para siempre. Modifiqué la expresión regular original para que funcione con la sintaxis de Java.Expresión regular de Java ejecutando muy lento
private final static String pattern =
"\\b" +
"(" + // Capture 1: entire matched URL
"(?:" +
"[a-z][\\w-]+:" + // URL protocol and colon
"(?:" +
"/{1,3}" + // 1-3 slashes
"|" + // or
"[a-z0-9%]" + // Single letter or digit or '%'
// (Trying not to match e.g. "URI::Escape")
")" +
"|" + // or
"www\\d{0,3}[.]" + // "www.", "www1.", "www2." … "www999."
"|" + // or
"[a-z0-9.\\-]+[.][a-z]{2,4}/" + // looks like domain name followed by a slash
")" +
"(?:" + // One or more:
"[^\\s()<>]+" + // Run of non-space, non-()<>
"|" + // or
"\\((?:[^\\s()<>]+|(?:\\([^\\s()<>]+\\)))*\\)" + // balanced parens, up to 2 levels
")+" +
"(?:" + // End with:
"\\((?:[^\\s()<>]+|(?:\\([^\\s()<>]+\\)))*\\)" + // balanced parens, up to 2 levels
"|" + // or
"[^\\s`!\\-()\\[\\]{};:'\".,<>?«»“”‘’]" + // not a space or one of these punct chars (updated to add a 'dash'
")" +
")";
// @see http://daringfireball.net/2010/07/improved_regex_for_matching_urls
private static final Pattern DARING_FIREBALL_PATTERN = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
Si intento ejecutar lo siguiente, lleva una eternidad. Lo he reducido a la comparación de parens balanceados (creo). Si cambia el texto dentro de los parens, funciona bien, pero con unos 15 caracteres, comienza a disminuir exponencialmente.
final Matcher matcher = pattern.matcher("https://goo.gl/a(something_really_long_in_balanced_parens)");
boolean found = matcher.find();
¿Hay alguna manera de mejorar esta expresión regular para que las líneas sobre no tarden para siempre? Tengo aproximadamente 100 URL diferentes en una clase de prueba JUnit, y las necesito para seguir trabajando también.
http://www.regular-expressions.info/catastrophic.html –
@CarlosAguayo Awesome reference. La página enlazada http://www.regular-expressions.info/possessive.html tenía una solución que podríamos usar en nuestro caso. – sync