首页 > 解决方案 > 只否定正则表达式的一部分(制表和一个词)?

问题描述

我有以下输入:

192.168.1.5:5555    device
192.168.1.9:5555    offline
192.168.1.12:5555   device
192.168.1.13:5555   offline

这是我用来匹配 IP 地址和端口号的正则表达式:

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

正确的匹配只有在没有 制表的情况下,然后是“离线”这个词。因此,我编写了以下正则表达式并将其添加到上一个正则表达式的末尾:

(?!\t*offline)

但遗憾的是我没有得到想要的输出,应该是:

192.168.1.5:5555    device
192.168.1.12:5555   device

标签: javaregex

解决方案


您可以使用

(?<!\d)(?:[01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])(?:\.(?:[01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){3}(?::\d{1,5})?+(?!\d|\t*offline)

查看正则表达式演示

正则表达式详细信息

  • (?<!\d)- 左侧数字边界(不允许紧靠左侧的数字)
  • (?:[01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])(?:\.(?:[01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){3}- IP 模式(4 个点分隔的八位字节)
  • (?::\d{1,5})?+- a 出现 1 或 0 次(可选出现),:然后出现 1 到 5 位数字(注意所有格?+量词不允许回溯到模式中)
  • (?!\d|\t*offline)offline-当前位置的右侧不允许紧跟字符串的数字或 0+ 制表符。

推荐阅读