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

时间:2015-03-12 15:33:16

标签: regex optimization

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

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

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

示例:

我的正则表达式适用于普通网址,但在以下情况中:

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不匹配,这是非常低效的。

1 个答案:

答案 0 :(得分:1)

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

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

RegEx Demo

而不是 25k +步骤在正则表达式调试器中现在只需62步来拒绝这个不匹配的网址。