正则表达式 - 不匹配 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
检查字符串是否只包含数字。
如果您只需要一个与 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+ 个字符(换行符除外)直到字符串末尾
$
- 字符串结尾。
我正在尝试创建一个正则表达式来匹配未格式化为 : 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
检查字符串是否只包含数字。
如果您只需要一个与 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+ 个字符(换行符除外)直到字符串末尾$
- 字符串结尾。