我正在使用这个正则表达式(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 回答
不工作到底是什么意思?
你可以尝试这样的事情:(^([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
当我们在谷歌上搜索“如何验证端口号”时,我们不幸登陆了这里
但是(除非你真的别无选择......),
正则表达式显然不是验证端口号的方法!
“一个”(稍微好一点)的方式可能是:
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。 ...
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 个字符串。我只能有 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}))?)*
更严格的方法是使用正则表达式匹配所有最多 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}$)*
也登陆这里,专门搜索 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])$
享受 !
"^((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 之间的所有内容。
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])))))$/
这是排除以 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]))?$
关联:
解决方案:
Dim Minlenght As Integer = 1
Dim Maxlenght As Integer = 65536
Regex.IsMatch(sInput,"(^\d{0},{1}$)", "{" + Minlenght, Maxlenght + "}")
^((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 不带前导零 例如:====
(6553[0-5])
: 65530-65535(655[0-2][0-9])
: 65500-65529(65[0-4][0-9]{2})
: 65000-65499(6[0-4][0-9]{3})
: 60000-64999([1-5][0-9]{4})
: 10000-59999([0-5]{0,5})
:00000-55555(用于前导零)([0][0-9]{1,4})
: 00000-09999(用于前导零)([0-9]{1,4})
:0000-9999(用于前导零)
@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])$
如果变量是介于 1 和 65536(含)之间的整数,则...
if [[ "$port" =~ ^[0-9]+$ && $port -ge 1 && $port -le 65536 ]]; then