正则表达式在带点的字符串中最后一次出现 ipv4

Regexp to get last occurance of ipv4 in a string with dots

我有一个正则表达式来查找 ipv4 匹配项:

/(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/

我需要在以下字符串中获取最后可能出现的 ipv4:

abc 195.4.205.1 fgh
abc 4.195.4.205.1 fgh
abc 4.195.4.205.1.99 fgh
abc 4.195.4.205.1.999 fgh

这些字符串的结果应该是:

195.4.205.1
195.4.205.1
4.205.1.99
4.205.1.99

我读过 负前瞻,但我不知道如何使用它。

请帮助我。提前致谢

您不需要环顾四周。您可以匹配到字符串的末尾,然后使用单词边界和回溯直到模式匹配没有结束边界的最后一次出现以获取 999

中的 99

使用单个捕获组来获取完整部分而不是单独的组,并使用非捕获组来获取外部组内的交替。

.*\b((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))

看到一个regex demo

或者用量词短一点重复3次:

.*\b((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})

const regex = /.*\b((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})/;
[
  "abc 195.4.205.1 fgh",
  "abc 4.195.4.205.1 fgh",
  "abc 4.195.4.205.1.99 fgh",
  "abc 4.195.4.205.1.999 fgh"
].forEach(s => {
  const match = s.match(regex);
  if (match) {
    console.log(match[1]);
  }
});

如果您想匹配一个字符串中的更多数字,您可以通过可选地匹配数字后跟一个点来启动模式,然后在捕获组 1 中使用您的模式。

(?:\d+\.)*((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})

Regex demo

const regex = /(?:\d+\.)*((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})/g;
const s = " abc 4.195.4.205.1.999 fgh 23.59.10.662 juia abc 195.4.205.1 fgh abc 4.195.4.205.1 fgh abc 4.195.4.205.1.99 fghabc 4.195.4.205.1.999 fgh";
console.log(Array.from(s.matchAll(regex), m => m[1]));