如何用正则表达式选择这个字符?

问题描述

例如我有这四个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})$

解决了单个 1 的问题,但又做了一个

解决方法

根据你给出的规则,这个正则表达式应该可以工作:

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
  • ) 关闭群组
  • $ 字符串结束

Regex demo