我想写一个匹配端口的正则表达式。这很好用,但通常时间也会匹配。我想创建否定的前瞻和后视,这样如果字符串中有另一个冒号,它就不应该匹配。但我犯了一个错误,我无法发现它:
我希望端口匹配,但不匹配时间。
(?<!:):\d{1,5}\b(?!:)
这是保存的正则表达式的链接。
有时会出现这样的端口:443 和 :80 而没有 IP 信息。这就是为什么我正在研究环视解决方案。
如果你对一行中的单个
:
之后的任何事情感兴趣:
^[^:]*:(\d{1,5})$
并使用第 1 组作为您的端口。
如果你想更严格一点,将端口范围限制为实际的 0 到 65535,你可以使用这个:
^[^:]*:(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[0-5]?\d{1,4})$
(为了“简洁起见;-)”我允许在此正则表达式中使用前导零)
正如您提到的 Ecmascript,这里的解决方案可以独立匹配端口号或作为 IPv4 的结尾部分:
const regex = /(?:\.\d+|\B)(?::)(\d{1,5})\b(?!:)/g;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('(?:\\.\\d+|\\B)(?::)(\\d{1,5})\\b(?!:)', 'g')
const str = `10.0.243.7:38518 :440
62.11.21.68:443 port :80
01:11:22
21:15:19
:443 `;
let m;
ports = Array.from(str.matchAll(regex), (m) => m[1])
console.log(ports)
如果您使用的是 Javascript 并且可以使用可变长度后视,则可以在左侧断言
:
,但在左侧断言不是 .
,后跟数字,然后是 :
:
(?<=:)(?<!:\d+:)\d{1,5}\b(?!:)
const regex = /(?<=:)(?<!:\d+:)\d{1,5}\b(?!:)/g;
const s = `10.0.243.7:38518
62.11.21.68:443
01:11:22
21:15:19`;
console.log(s.match(regex));
如果你也想匹配冒号:
(?<!:\d+):\d{1,5}\b(?!:)
const regex = /(?<!:\d+):\d{1,5}\b(?!:)/g;
const s = `10.0.243.7:38518
62.11.21.68:443
01:11:22
21:15:19`;
console.log(s.match(regex));
我想写一个匹配端口的正则表达式。 我忘了说,有时显示的端口没有 IP。
^(((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b)|){4}:\K((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}))$
这会处理所有情况,包括显示的端口没有 IP 地址。
实际操作.
^
)。\b
)防止第四个匹配.:
模式。\K
) 以忽略匹配中的 IPv4 地址。$
).