我正在尝试创建一个正则表达式,该表达式与未格式化为:ip|port的内容匹配。
端口值可以介于 [1, 65535] 之间。
数据集示例:(1( 8.8.8.8|0(错误:不允许端口 0((2( 8.8.8.8|1(良好((3( 8.8.8.8|65536(错误:端口> 65535((4( 8.8.8.8|dawda (错误:字符(
正则表达式(匹配错误数据(应匹配 (1(、(3( 和 (4(。
考虑到 ip 部分将永远是正确的(无需正则表达式(,我需要检查的是端口。正因为如此,我在行尾开始评估,如下所示:
正则表达式匹配 0 到 65535 之间的端口:
\|(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}(
具有行尾匹配的正则表达式:
\|(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}($
现在,我想将其否定为以有效端口结尾的捕获行。我查看其他论坛(如何在正则表达式中否定特定单词?,正则表达式和否定整个字符组(并了解负面的前瞻性正则表达式。
根据这些论坛和负面的前瞻正则表达式,我的正则表达式应该是:
^(?!(MY_REGEX((。*$
我修改了我的正则表达式并为 ip 部分添加了 .* 以插入 ^。
行尾的负正则表达式:
^(?!.\|(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}((.$
我遇到的问题是结尾部分 .*$ 允许在端口号之后添加某些内容。最后,这段代码将使用PHP执行。根据 PHP 的说法,不支持可变长度的后视,这使我首先选择了前瞻正则表达式。
感谢您的帮助。
最合适的方法是用(.*)
(除换行符字符以外的任何 0+ 字符(捕获|
后的部分,并使用一些 PHP 代码对其进行验证:
if (preg_match('~^d+(?:.d+){3}|(.*)$~', $s, $res)) {
if (ctype_digit($res[1]) && intval($res[1]) > 0 && intval($res[1]) < 65536 ) { // valid port, omit
echo "The port is valid: " . $res[1];
} else {
echo "Invalid port: " . $res[1];
}
}
ctype_digit
检查字符串是否仅包含数字。
请参阅在线 PHP 演示。
如果您只需要一个与 PCRE 兼容的模式,则可以使用以下模式:
^d+(?:.d+){3}|(?!(?:[1-9]d{0,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])$)(.*)$
查看正则表达式演示
请参阅以下详细信息:
^
- 字符串的开头d+
- 1+ 位数字(?:.d+){3}
- 3 个.
序列,后跟 1+ 位数字(不需要验证的 IP 模式,您认为它是预先验证的(|
- 字面|
(?!(?:[1-9]d{0,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])$)
- 一个负的预视,如果在字符串末尾找到以下数值,则匹配失败:[1-9]d{0,3}
- 从1
到9
的数字,然后是 0 到 3 位数字(1
到9999
([1-5]d{4}
- 从1
到5
的数字,然后是 4 位数字(10000
到59999
(6[0-4]d{3}
-6
,从0
到4
的数字,然后是 3 位数字(60000
到64999
(65[0-4]d{2}
-65
,从0
到4
的数字,和2个数字(65000
到65499
(655[0-2]d
-655
,从0
到2
的数字,和1个数字(65500
到65529
(6553[0-5]
-65530
到65535
.
(.*)
- 捕获不是有效端口的部分,任何 0+ 字符(换行符字符除外(直到字符串末尾$
- 字符串的结尾。