Java 只否定正则表达式的一部分(制表和一个单词)?
我有以下意见:Java 只否定正则表达式的一部分(制表和一个单词)?,java,regex,Java,Regex,我有以下意见: 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]|2
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}
只有当有而不是制表,然后是单词“offline”时,才是正确的匹配。因此,我编写了以下正则表达式,并将其添加到上一个正则表达式的末尾:
(?!\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)
(?
见
正则表达式详细信息
(?-左侧数字边界(不允许紧靠左侧的数字)
(?:[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})+
-1或0次出现(可选出现)的:
,然后是1到5位数字(注意所有格?+
量词不允许回溯到模式)
(?!\d |\t*offline)
-当前位置右侧不允许紧跟着offline
字符串的数字或0+制表符
@WiktorStribiżew在IP+端口模式周围放置\b
很遗憾没有起作用。是的,这起作用了,谢谢!您基本上添加了boudaries,在正则表达式的最后一部分添加了一个数字的否定,对吗?@Janeliep我确保在((?)之前和之后((?!\d)
)模式,并且只有在使用停止回溯到模式的所有格量词检查可选端口模式后,才能执行一次负前瞻检查。为什么有必要禁止回溯到模式?@janelep在匹配可选模式后触发一次前瞻检查。