正则表达式 - 不匹配 IOC IP|PORT 的行尾

Regex - Not match end of line for IOC IP|PORT

我正在尝试创建一个正则表达式来匹配未格式化为 : 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})

Regex with end of line matching:
\|(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})$

现在,我想否定它以捕获以有效端口结尾的行。我查看了其他论坛 (How to negate specific word in regex?, Regular Expressions and negating a whole character group) 并了解了负先行正则表达式。

根据那些论坛和负前瞻正则表达式,我的正则表达式应该是:

^(?!(MY_REGEX)).*$

我修改了正则表达式并为 ip 部分添加了 .* 以插入 ^。

Negative regex at end of line:
^(?!.\|(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 检查字符串是否只包含数字。

参见online PHP demo

如果您只需要一个与 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])$)(.*)$

regex demo

查看以下详情:

  • ^ - 字符串开头
  • \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+ 个字符(换行符除外)直到字符串末尾
  • $ - 字符串结尾。