Cuando se usa Regex.IsMatch (C#, .Net 4.5) en una cadena específica, la CPU alcanza el 100 %.
Cuerda:
https://www.facebook.com/CashKingPirates/photos/a.197028616990372.62904.196982426994991/1186500984709792/?type=1&permPage=1Patrón:
^http(s)?://([\w-]+.)+[\w-]+(/[\w- ./?%&=])?$Código completo:
Regex.IsMatch("https://www.facebook.com/CashKingPirates/photos/a.197028616990372.62904.196982426994991/1186500984709792/?type=1&permPage=1", @"^http(s)?://([\w-]+.)+[\w-]+(/[\w- ./?%&=])?$");Descubrí que redactar la URL evita este problema. URL redactada:
https://www.facebook.com/CashKingPirates/photos/a.197028616990372.62904.196982426994991/1186500984709792Pero todavía muy interesado en entender qué causa esto.
Como señaló nu11p01n73R, tiene muchos retrocesos con su expresión regular. Esto se debe a que partes de su expresión pueden coincidir con lo mismo, lo que le da al motor muchas opciones que tiene que probar antes de encontrar un resultado.
Puede evitar esto cambiando la expresión regular para hacer que las secciones individuales sean más específicas. En su caso, la causa es que quería hacer coincidir un punto real pero usó el carácter de coincidencia total . en cambio. Deberías escapar de eso a \. .
Esto ya debería reducir mucho la necesidad de retroceso y hacerlo rápido:
^http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=])?$Y si realmente desea hacer coincidir la cadena original, debe agregar un cuantificador a la clase de caracteres al final:
^http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]+)?$ ↑Le sugiero que consulte el sitio web http://regexr.com/ para probar su expresión regular.
La versión corregida de su expresión regular es esta:
^(https?://(?:[\w]+\.?[\w]+)+[\w]/?)([\w\./]+)(\?[\w-=&%]+)?$También tiene 3 grupos:
También recuerde que para verificar el carácter real del punto (.) en su expresión regular, debe usar \. no .
Su expresión regular sufre por catastrophic backtracking . Simplemente puede usar
^http(s)?://([\w.-])+(/[\w ./?%&=-]+)*$Ver demostración.