RegEx用于验证带有可选端口的URL

时间:2019-04-28 15:25:46

标签: regex

我正在尝试拨入此正则表达式以验证URL是否以https开头,并且如果提供了端口,则唯一有效的值是443或5443。该正则表达式非常接近,但还不足够。

^(https:\/\/)([a-zA-Z\d\.]{2,})\.([a-zA-Z]{2,})(:5{0,1}443)?(.)*

如何解决此问题?

3 个答案:

答案 0 :(得分:1)

您应该在此可选端口组后面附加一个/,以便在/之前不允许任何数字。尝试使用此正则表达式,

^(https:\/\/)([a-zA-Z\d\.]{2,})\.([a-zA-Z]{2,})(:5?443)?\/\S*

注意,我也将(:5{0,1}443)?更改为(:5?443)?,并将最后一个.*更改为\S*,因此url不会捕获空格,因为URL中的空格不是有效的东西。除此之外,除非需要它们,否则您也可以除去正则表达式中的许多组。

Regex Demo

编辑:

正如您在评论中所说,您也要匹配以下网址,

https://example.com
https:example.com
https:example.com:443

您需要通过在\/\S*后面放置?来使其成为可选部分。修改后的正则表达式将变成这样,它将与以上URL匹配。

^https:\/\/([a-zA-Z\d\.]{2,})\.([a-zA-Z]{2,})(:5?443)?(\/\S*)?

Demo with filepath part being optional

答案 1 :(得分:0)

这是一个主流的URL验证器,用于测试它是否在空白边界之间。
它仅允许使用https设备和端口号5443或443。

(?<!\S)https://(?:\S+(?::\S*)?@)?(?:(?:(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))|localhost)(?::5?443)?(?:/[^\s]*)?(?!\S)

可读版本

 (?<! \S )

 https ://
 (?:
      \S+ 
      (?: : \S* )?
      @
 )?
 (?:
      (?:
           (?:
                [1-9] \d? 
             |  1 \d\d 
             |  2 [01] \d 
             |  22 [0-3] 
           )
           (?:
                \.
                (?: 1? \d{1,2} | 2 [0-4] \d | 25 [0-5] )
           ){2}
           (?:
                \.
                (?:
                     [1-9] \d? 
                  |  1 \d\d 
                  |  2 [0-4] \d 
                  |  25 [0-4] 
                )
           )
        |  (?:
                (?: [a-z\u00a1-\uffff0-9]+ -? )*
                [a-z\u00a1-\uffff0-9]+ 
           )
           (?:
                \.
                (?: [a-z\u00a1-\uffff0-9]+ -? )*
                [a-z\u00a1-\uffff0-9]+ 
           )*
           (?:
                \.
                (?: [a-z\u00a1-\uffff]{2,} )
           )
      )
   |  localhost
 )
 (?: : 5? 443 )?
 (?: / [^\s]* )?

 (?! \S )

答案 2 :(得分:-1)

您的RegEx似乎工作正常。出于安全考虑,您可以尝试使用this RegEx并添加其他边界:

^(https:\/\/)([a-zA-Z\d\.]{2,})\.([a-zA-Z]{2,}):(5443|443)?$

enter image description here

我只添加了 $ 结尾字符,以便从右侧绑定您的原始表达式。您可以在此捕获组中仅添加一些端口号(如果有):

(5443|443) 

如果愿意,您也可以删除不必要的边界。