java - 只否定正则表达式的一部分(制表和一个词)?
问题描述
我有以下输入:
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
解决方案
您可以使用
(?<!\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+ 制表符。
推荐阅读
- apache-kafka - 使用 JConsole 测量 Kafka 流的性能
- android - 改造请求类忽略字段
- javascript - TinyMCE 编辑器如何使用光标自定义 HTML 元素进行选择?
- neo4j - 加载最新的数据库转储后无法打开 Neo4j 浏览器
- javascript - 打印屏幕中的自定义页眉和页脚
- c++ - 示例::findFile()的opencv教程问题
- json - 如何让 sqlachemy 看到 json_each 或 jsonb_each 中的隐式横向连接?
- javascript - 在 useEffect 中未正确设置 React ref
- drupal - Drupal 8 中的 Swetalert 表单
- python - Python re.sub 如何将字符串中的每个 0 替换为 2 当旁边没有 1 时?