问题描述
例如我有这四个IP地址:
10.100.0.11;错了
10.100.1.12;不错
10.100.11.4;不错
10.100.44.1;错了
任务有简单的规则。第三名不能是0,第四名不能是solo 1。 我需要从不同路由器的 ip 表中选择它们,我只知道这个规则。 我的解决方案:
^(10.100.[1-9]{1,3}.[023456789]{1,3})$
但在这种情况下,每个带有 1 的数字(如 10、100 等)都丢失了,因此这种解决方案是错误的。
^(10.100.[1-9]{1,3}.[1-9]{2,3})$
解决方法
根据你给出的规则,这个正则表达式应该可以工作:
10\.100\.([123456789]\d*|\d{2,})\.([^1]$|\d{2,})
它也匹配包含 0 但不在第一位的第三个位置编号。
所以 10.100.10.4
将匹配以及 10.100.02.4
我不知道这是否是预期的行为,因为我不熟悉 ip 地址。
最后一部分 \.([^1]$|\d{2,})
是这样的:
"在第三个点之后是
- 后跟行尾的非 1 字符
- 或两位或更多位数字"
如果您想避免包含非数字字符(如 10.100.12.a
)的格式错误的字符串进行匹配,您应该将 [^1]
替换为 [023456789]
或将更懒惰的(因此更好;)替换为 {{1 }}
我使用 https://regex101.com 调试正则表达式。这太棒了。 如果你想玩的话,这里是your regex
,你可能会使用
^10\.100\.[1-9]{1,3}\.(?:[02-9]|\d{2,3})$
模式匹配
-
^
字符串开头 -
10\.100\.
匹配10.100.
(注意转义点以使其字面匹配) -
[1-9]{1,3}
匹配 3 次数字 1-9 -
\.
匹配一个点 -
(?:
非捕获组-
[02-9]
匹配一个数字 0 或 2-9 -
|
或 -
\d{2,3}
匹配 2 或 3 位数字 0-9
-
-
)
关闭群组 -
$
字符串结束