正则表达式匹配,仅当找到冒号时

问题描述 投票:0回答:5

我想写一个匹配端口的正则表达式。这很好用,但通常时间也会匹配。我想创建否定的前瞻和后视,这样如果字符串中有另一个冒号,它就不应该匹配。但我犯了一个错误,我无法发现它:

我希望端口匹配,但不匹配时间。

(?<!:):\d{1,5}\b(?!:)

这是保存的正则表达式链接。

有时会出现这样的端口:443 和 :80 而没有 IP 信息。这就是为什么我正在研究环视解决方案。

regex regex-lookarounds
5个回答
0
投票

这个正则表达式:

¹

^\d+\.\d+\.\d+\.\d+:\K\d{1,5}

²

^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}:\K\d{1,5}

假设

ip's
只有

¹ 在线演示
² 在线演示


0
投票

如果你对一行中的单个

:
之后的任何事情感兴趣:

^[^:]*:(\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})$

(为了“简洁起见;-)”我允许在此正则表达式中使用前导零)


0
投票

正如您提到的 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)


0
投票

如果您使用的是 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));


0
投票

我想写一个匹配端口的正则表达式。 我忘了说,有时显示的端口没有 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 地址。

实际操作.

  • 首先断言字符串的开头(
    ^
    )。
  • 然后从 0-9、10-99、100-199、200-249 或 250-255 中捕获一个数字。
  • 要求数字后有一个句点,重复4次。
  • 单词边界(
    \b
    )防止第四个匹配
    .:
    模式。
  • 然后我们重置 (
    \K
    ) 以忽略匹配中的 IPv4 地址。
  • 然后我们为端口匹配0-9、10-99、100-999、1000-9999、10000-59999、60000-64999、65000-65499、65500-65529、65530-65535
  • 最后断言结束(
    $
    ).
© www.soinside.com 2019 - 2024. All rights reserved.