正则表达式 - 与 IOC IP 的行尾不匹配|港口



我正在尝试创建一个正则表达式,该表达式与未格式化为: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}- 从19的数字,然后是 0 到 3 位数字(19999(
    • [1-5]d{4}- 从15的数字,然后是 4 位数字(1000059999(
    • 6[0-4]d{3}-6,从04的数字,然后是 3 位数字(6000064999(
    • 65[0-4]d{2}-65,从04的数字,和2个数字(6500065499(
    • 655[0-2]d-655,从02的数字,和1个数字(6550065529(
    • 6553[0-5]-6553065535.
  • (.*)- 捕获不是有效端口的部分,任何 0+ 字符(换行符字符除外(直到字符串末尾
  • $- 字符串的结尾。

最新更新