13

我正在使用这个正则表达式(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}来验证端口号。不知何故,这不起作用。这有什么问题?谁能指出我。

4

13 回答 13

52

不工作到底是什么意思?

你可以尝试这样的事情:(^([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])$这里获得)。

这将确保任何给定的字符串都是数字的并且介于 和0之间65535

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

2022 年 2 月 2 日更新:修复了正则表达式以拒绝等值00。更新的正则表达式来自以下评论。这个正则表达式可以在这里更好地理解和可视化:https ://www.debuggex.com/r/jjEFZZQ34aPvCBMA

于 2012-10-19T05:51:31.657 回答
13

当我们在谷歌上搜索“如何验证端口号”时,我们不幸登陆了这里

但是(除非你真的别无选择......),

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

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

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 位数字怎么办!?)
  • ETC。 ...
于 2019-01-30T16:19:44.373 回答
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');}" />
于 2013-05-02T19:42:57.890 回答
3

这是我用来验证防火墙端口设置的示例。原始答案将匹配 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}))?)*
于 2019-11-13T21:53:13.253 回答
2

更严格的方法是使用正则表达式匹配所有最多 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}$)*
于 2015-05-18T11:55:03.807 回答
2

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

达到与 相同的最小解决方案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])$

享受 !

于 2021-05-21T11:58:11.670 回答
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 之间的所有内容。

于 2016-12-29T00:18:04.477 回答
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])))))$/

于 2016-02-04T22:17:50.470 回答
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

于 2016-10-24T08:19:22.443 回答
1

解决方案:

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

Regex.IsMatch(sInput,"(^\d{0},{1}$)", "{" + Minlenght, Maxlenght + "}")
于 2017-05-26T09:56:12.073 回答
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(用于前导零)
于 2021-07-29T01:15:42.617 回答
1

@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])$
于 2016-06-15T03:37:40.320 回答
0

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

if [[ "$port" =~ ^[0-9]+$ && $port -ge 1 && $port -le 65536 ]]; then
于 2020-09-05T23:47:32.687 回答