优化仅匹配没有查询字符串的完整 url 的正则表达式

Optimizing regex that only matchs full urls that don't have a query string

我需要优化以下正则表达式:

^(?:ht|f)tps?://[^\s]+/[^\s]+\.([^\?]+)?([\?]+$|$)

它搜索以 http(s) 或 ftp(s) 开头并包含路径和句点的 urls。如果字符“?”存在(可能出现多次) URL 必须以它结尾,如果有任何不是“?”的字符之后 ”?”字符串将不匹配(例如查询字符串)。

示例:

我的正则表达式在 normal urls 下工作正常,但在以下情况下:

http://u.example.something.com/abc=aaadddrBccc2SgFV000ALK2Qddd_;_vvv=Yu3DUzBHNlzcHIEY29sYMTEzZHQ5NjUzBHNlY9sbwNiZjEEdnRpZANRMU0wMV8xBHBvcwMx/CC=20/RE=MU0wMV8xBHBvcwMx/UU=10/ZZ=http://hhh.w.example.com/?uv=xxxxxx878787xxxxxxxxjhkjhkjhjkhADFADFS-&u=http://wwww.example.com/%2fuuu-lllllll%2sdfg-afd-adsfadf%2asdfaf000%3asdfasdfasfd%3dbing%26uasdfadf%3dcpc%26asdfadf%3d_ASDF234_ASDF%26asdfasF_asdfasdf%3d%252Bfasdfadsf%2520%252Basdf%2520%252Bdesign%26asdfasdf_aasdf%3dlf9McvAV%7cFADF%7c4063555565%7cpkw%7c%252Bfree%2520%252Bpcb%2520%252Basdf%7casdf%7asdf%7adf%7adf%7c/PO=0/UJ=iasdf7PASDFASDF-?p=this+is+an+example; 

reqex 引擎将走 ~45K 步来最终决定 url 不应该匹配,这是非常低效的。

您实际上可以调整正则表达式以使用基于否定的模式 并显着提高正则表达式的性能。使用这个正则表达式:

^(?:ht|f)tps?://[^/]+/[^.]+\.([^?]+)\?*$

RegEx Demo

在正则表达式调试器中不再需要 25k+ 步,现在只需要 62 步 就可以拒绝不匹配的 URL。