优化仅匹配没有查询字符串的完整 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 必须以它结尾,如果有任何不是“?”的字符之后 ”?”字符串将不匹配(例如查询字符串)。
示例:
- http://www.example.com/page.html - 将匹配
- http://www.example.com/page/nothing - 不匹配
- http://www.example.com/page/nothing.html? - 将匹配
- http://www.example.com/page/nothing.html?a=anything - 不匹配
- http://www.example.com/page/nothing.html??????将匹配
我的正则表达式在 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?://[^/]+/[^.]+\.([^?]+)\?*$
在正则表达式调试器中不再需要 25k+ 步,现在只需要 62 步 就可以拒绝不匹配的 URL。
我需要优化以下正则表达式:
^(?:ht|f)tps?://[^\s]+/[^\s]+\.([^\?]+)?([\?]+$|$)
它搜索以 http(s) 或 ftp(s) 开头并包含路径和句点的 urls。如果字符“?”存在(可能出现多次) URL 必须以它结尾,如果有任何不是“?”的字符之后 ”?”字符串将不匹配(例如查询字符串)。
示例:
- http://www.example.com/page.html - 将匹配
- http://www.example.com/page/nothing - 不匹配
- http://www.example.com/page/nothing.html? - 将匹配
- http://www.example.com/page/nothing.html?a=anything - 不匹配
- http://www.example.com/page/nothing.html??????将匹配
我的正则表达式在 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?://[^/]+/[^.]+\.([^?]+)\?*$
在正则表达式调试器中不再需要 25k+ 步,现在只需要 62 步 就可以拒绝不匹配的 URL。