estoy tratando de utilizar una URL que coincida con la expresión regular que obtuve de http://daringfireball.net/2010/07/improved_regex_for_matching_urls¿Cómo puedo hacer que esta expresión regular no dé como resultado un "retroceso catastrófico"?
(?xi)
\b
( # Capture 1: entire matched URL
(?:
https?:// # http or https protocol
| # 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
)
)
Sobre la base de las respuestas a another question, parece que hay casos en los que causan esta expresión regular para backtrack catastrophically. Por ejemplo:
var re = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/i;
re.test("http://google.com/?q=(AAAAAAAAAAAAAAAAAAAAAAAAAAAAA)")
... puede tomar un tiempo muy largo para ejecutar (por ejemplo, en Chrome)
Me parece que el problema radica en esta parte del código:
(?: # One or more:
[^\s()<>]+ # Run of non-space, non-()<>
| # or
\(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels
)+
... que parece ser más o menos equivalente a (.+|\((.+|(\(.+\)))*\))+
, que parece que contiene (.+)+
¿hay un cambio puedo hacer que evitará que?
Realmente, debe descartar esta expresión regular y encontrar una que haga lo que necesita. Todavía no he visto una aplicación que sea lo suficientemente esponjosa como para usar una expresión regular para el análisis de URL (en lugar de un analizador real) y lo suficientemente grave como para que necesite manejar paréntesis anidados en una URL. Comenzar con "https?: //" y finalizar en el primer carácter que debe estar codificado en% en una URL adecuada, pero no lo hará, manejará casi todo, y no hará que la matriz de expresiones regulares sea exponencial. –
¿Has probado Rubular? Tiene una práctica hoja de trucos debajo, y puedes agregar todo tipo de expresiones de prueba para asegurarte de que funciona. (P.S. Soy consciente de que esto es para js, pero esto sigue siendo un recurso útil, no obstante.) Http://rubular.com/ – Edwin