正则表达式匹配IP子网

4
我需要一个能够匹配IP子网的C#正则表达式,比如"127.65.231",但不能匹配在该子网上的IP地址,比如"127.65.231.111"。我已经找到了这个用于IP地址的正则表达式:

@"\b\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}\b"

我想只需删除检查最后一个八位的部分,就可以满足要求:

@"\b\d{1,3}.\d{1,3}.\d{1,3}\b"

但是,这将匹配IP地址和子网。有谁能帮忙解决这个问题吗?

2
IP地址由0到255的八进制数组成。您的正则表达式将匹配无效的八进制数,例如“400”。如果您想要更精确的匹配,那么正则表达式将会更加复杂。 - Brian Stephens
是的,正如@BrianStephens所说,您的正则表达式也会匹配999,这根本不是一个有效的IP。 - Sriram Sakthivel
可能是子网掩码的正则表达式?的重复问题。 - jason
2个回答

1
你可以尝试使用前瞻。另外,请转义 . 字符——否则它将匹配任何字符:
@"\b\d{1,3}\.\d{1,3}\.\d{1,3}(?=\.\d{1,3})\b"

这将匹配任何类似于127.65.231的字符串,只要它后面跟着一个类似于.111的字符串。

0
@"^\d{1,3}\.\d{1,3}\.\d{1,3}$"

使用行锚点。在正则表达式的开头加上^,在结尾加上$,以验证输入的开头和结尾。

这将匹配127.65.231但不匹配127.65.231.111


1
它还会匹配999.999.999,这是无效的。 - Eric Lippert
@Eric Lippert,我现在从我的测试中看到了这一点,但是我该如何将其更改为仅匹配有效的IP八位数,而不是超过255个? - Russ Clark
它们只有256个。只需列出它们。 :) - Eric Lippert
1
更加严肃地说:这对于正则表达式来说真的不是一个难以解决的问题。如果不清楚如何使用工具来解决问题,可能是在使用错误的工具。 - Eric Lippert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接