你能帮我简化我的ip范围匹配正则表达式吗?

时间:2014-02-08 12:57:57

标签: php regex ip-address

我有一个匹配IP地址的正则表达式。

看起来像:

^(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]?|*|25[0-5]-25[0-5]|2[0-4][0-9]-25[0-5]|2[0-4][0-9]-2[0-4][0-9]|[01]?[0-9][0-9]?-25[0-5]|[01]?[0-9][0-9]?-2[0-4][0-9]|[01]?[0-9][0-9]?-[01]?[0-9][0-9])$

你将从SO上的许多其他帖子中看出来。但我修改了它以匹配范围XXX.XXX.XXX.XXX-XXY

然而现在看起来有点复杂,尤其是最终()捕获。如果可能的话,我想帮助简化这个正则表达式。

要清楚

aaaa - not matched
999.1.1.1 - not matched
1.1.1.999 - not matched
192.168.2.1 - matched
192.168.2.* - matched
192.168.2.10-20 - matched

修改

我忘了提到我也需要现有的捕获组。

3 个答案:

答案 0 :(得分:1)

您可以使用可选组(?: ... )?,并使用另一个分组来获取IP的前3个部分吗?

^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
 (?:25[0-5](?:-25[0-5])?|
  2[0-4][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]?))?|
  \*)$

regex101 demo


更新了捕获组

^((?: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](?:-25[0-5])?|
  2[0-4][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]?))?|
  \*)$

答案 1 :(得分:0)

这有效 -

^(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]?)(?:\-(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(\*))$

可以看出here

答案 2 :(得分:0)

这应该有效并且有点短:

^((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(\*|(25[0-5]|2[0-4]\d|[01]?\d{1,2}))(\-(25[0-5]|2[0-4]\d|[01]?\d{1,2}))?$

请参阅: http://regex101.com/r/sD9iZ0