【问题标题】:How to select with regex this character?如何用正则表达式选择这个字符?
【发布时间】:2021-07-20 19:23:08
【问题描述】:

例如,我有这四个 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的问题,但是再做一个。

【问题讨论】:

  • 您需要转义.s,这些是正则表达式中的特殊字符。 [023456789] 不允许存在 1,但 12 需要 1。最后的 * 也是无效的,如果您希望最后一个数字是可选的,请执行 {0,3} 但这似乎是错误的
  • 我知道 [023456789] 不允许这样做。我在问题中做了第二个,但最后可能会有一个单独的。
  • 也许像^(10[.]100[.][1-9]{1,3}[.](?:[02-9]|1\d){1,3}) 这样的东西适合你?更多的例子会有所帮助。那将允许10.100.44.000 允许吗?这也允许大于 255 的数字,并且不允许 ipv6。
  • 可能你是对的,地址是 ipv4,而 10.100.44.0 可以是一个地址,但我们没有使用它们,但你的解决方案对我有用,所以谢谢
  • ^10\.100\.(?!0\.)\d+\.(?!1$)\d{1,3}$,见regex101.com/r/s36lXT/1

标签: regex ip


【解决方案1】:

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

10\.100\.([123456789]\d*|\d{2,})\.([^1]$|\d{2,})

它也匹配包含 0 但不是第一个位置的第 3 个位置编号。 所以10.100.10.4 将与10.100.02.4 匹配

我不知道这是否是预期的行为,因为我不熟悉 IP 地址。

最后一部分\.([^1]$|\d{2,}) 是这样写的:

"在第三个点之后

  • 非 1 的字符后跟行尾
  • 或两位或多位数字”

如果您想避免包含非数字字符(如 10.100.12.a)的格式错误的字符串匹配,您应该将 [^1] 替换为 [023456789] 或惰性(因此更好;)替换为 [02-9]

我使用https://regex101.com 来调试正则表达式。真是太棒了。 如果你想玩,这里是your regex

【讨论】:

    【解决方案2】:

    你可能会使用

    ^10\.100\.[1-9]{1,3}\.(?:[02-9]|\d{2,3})$
    

    模式匹配

    • ^ 字符串开始
    • 10\.100\. 匹配 10.100.(注意转义点以匹配字面意思)
    • [1-9]{1,3}一个数字1-9匹配3次
    • \.匹配一个点
    • (?:非捕获组
      • [02-9] 匹配一个数字 0 或 2-9
      • |或者
      • \d{2,3} 匹配 2 或 3 位 0-9
    • )关闭群
    • $字符串结束

    Regex demo

    【讨论】:

    • 我很感激!但是 :D 我什么也不能逃避,因为我不能使用 \ 字符。 #mikrotik 和 ?也是一个不可用的字符。在 mikrotik 网页中,他们说 mikrotik 脚本与正则表达式兼容,但在这种情况下......
    • @GáborFábos 尝试双重转义反斜杠^10\\.100\\.[1-9]{1,3}\\.(?:[02-9]|\\d{2,3})$
    • 啊,是的,在我写完评论后,我也有了这个想法。这样就不会出错。但返回一个空值作为变量。但不知何故,这可能是我的错
    猜你喜欢
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    相关资源
    最近更新 更多