正则表达式验证端口号

时间:2012-10-19 05:48:16

标签: regex vb.net .net-2.0

我正在使用此正则表达式(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}来验证端口号。不知怎的,这不起作用。这有什么问题?任何人都可以指出我。

13 个答案:

答案 0 :(得分:35)

不工作究竟是什么意思?

你可以尝试这样的事情:^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$(从here获得)。

这将确保任何给定的字符串都是数字,且在065535之间。

假设您的正则表达式匹配相同的范围,它缺少开始和结束锚点(分别为^$),因此它将允许除实际端口之外的其他字符串。

答案 1 :(得分:3)

Number()是你想要的功能“123a”返回NAN

parseInt()截断尾随字母“123a”返回123

<input type="text" id="txtFld" onblur="if(Number(this.value)>0 && Number(this.value)<65536){alert('valid port number');}" />

答案 2 :(得分:2)

npinti的回答是不对的。例如,它不允许输入端口号1000。对我来说,这个(不好,我是初学者)可以正常工作:

/^((((([1-9])|([1-9][0-9])|([1-9][0-9][0-9])|([1-9][0-9][0-9][0-9])|([1-6][0-5][0-5][0-3][0-5])))))$/

答案 3 :(得分:2)

这是单端口正则表达式验证,它排除以0开头的端口

^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])


这是端口范围的验证(例如1111-1111)

^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])(-([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$


链接:

https://github.com/findhit/proxywrap/issues/13

答案 4 :(得分:2)

"^((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{0,5})|([0-9]{1,4}))$"

它将允许0-65535之间的所有内容。

答案 5 :(得分:1)

更严格的方法是使正则表达式匹配所有数字,最多5位数 使用以下字符串:

*(^[1-9]{1}$|^[0-9]{2,4}$|^[0-9]{3,4}$|^[1-5]{1}[0-9]{1}[0-9]{1}[0-9]{1}[0-9]{1}$|^[1-6]{1}[0-4]{1}[0-9]{1}[0-9]{1}[0-9]{1}$|^[1-6]{1}[0-5]{1}[0-4]{1}[0-9]{1}[0-9]{1}$|^[1-6]{1}[0-5]{1}[0-5]{1}[0-3]{1}[0-5]{1}$)*

答案 6 :(得分:1)

不幸的是,我们何时在Google上搜索“如何验证端口号”

但是(除非您真的没有其他选择...)

正则表达式显然不是验证端口号的方法!

“一个”(稍微好一点)的方式可能是:

step 1: Convert your string into number, and return FALSE if it fails
step 2: return TRUE if your number is in [1-65535] range, and FALSE otherwise

各种原因,为什么Regex不是正确的方式?

  • 代码可读性(需要几分钟来理解)
  • 代码稳健性(有多种输入错误的方法,需要进行统一测试)
  • 代码灵活性(如果端口号可以扩展为64位数字!!)
  • 等...

答案 7 :(得分:1)

这是我用来验证防火墙端口设置的示例。原始答案将匹配2个字符串。我只能有1个字符串匹配项。

(6553[0-5]|655[0-2][0-9]|65[0-4][0-9][0-9]|6[0-4][0-9][0-9][0-9][0-9]|[1-5](\d){4}|[1-9](\d){0,3})

要获得:22,24:100,333,678,100:65535我的完整验证(只会返回1个匹配项)

(6553[0-5]|655[0-2][0-9]|65[0-4][0-9][0-9]|6[0-4][0-9][0-9][0-9][0-9]|[1-5](\d){4}|[0-9](\d){0,3})(:(6553[0-5]|655[0-2][0-9]|65[0-4][0-9][0-9]|6[0-4][0-9][0-9][0-9][0-9]|[1-5](\d){4}|[0-9](\d){0,3}))?(,(6553[0-5]|655[0-2][0-9]|65[0-4][0-9][0-9]|6[0-4][0-9][0-9][0-9][0-9]|[1-5](\d){4}|[0-9](\d){0,3}){1}(:(6553[0-5]|655[0-2][0-9]|65[0-4][0-9][0-9]|6[0-4][0-9][0-9][0-9][0-9]|[1-5](\d){4}|[0-9](\d){0,3}))?)*

答案 8 :(得分:1)

^((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{0,5})|([0][0-9]{1,4})|([0-9]{1,4}))$

我已经用 Junit 测试了上面的正则表达式,从 0-65535 运行 for 循环

例如:00001 - 65535 带前导零 1 - 65535 没有前导零 例如:====

  1. (6553[0-5]) : 65530-65535
  2. (655[0-2][0-9]) : 65500-65529
  3. (65[0-4][0-9]{2}):65000-65499
  4. (6[0-4][0-9]{3}) : 60000-64999
  5. ([1-5][0-9]{4}) : 10000-59999
  6. ([0-5]{0,5}) : 00000-55555(用于前导零)
  7. ([0][0-9]{1,4}) : 00000-09999(用于前导零)
  8. ([0-9]{1,4}) : 0000-9999(用于前导零)

答案 9 :(得分:0)

@npinti的答案允许端口号中的前导零,端口0表示选择任何可用的端口,所以我将其排除,以便正则表达式成为

^([1-9][0-9]{0,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$

如果你想允许端口0,那么

^(0|[1-9][0-9]{0,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$

答案 10 :(得分:0)

解决方案:

Dim Minlenght As Integer = 1
Dim Maxlenght As Integer = 65536

Regex.IsMatch(sInput,"(^\d{0},{1}$)", "{" + Minlenght, Maxlenght + "}")

答案 11 :(得分:0)

如果变量是1到65536(含)之间的整数,则...

transform

答案 12 :(得分:0)

也登陆这里,专门搜索 REGEX 以验证端口号。 我看到批准的解决方案尚未修复以涵盖所有场景(例如:007 端口等),并且来自其他站点的解决方案也未更新 (eg)。

达到与 saber tabatabaee yazdi 相同的最小解,应该正确覆盖 1-65535 范围:

^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$

享受吧!