【问题标题】:Regex: How can I match third IPv4 address?正则表达式:如何匹配第三个 IPv4 地址?
【发布时间】:2015-10-20 21:15:11
【问题描述】:

我是一个正则表达式菜鸟,在我的一生中,我无法弄清楚如何匹配包含三个 IPv4 地址的在线第三个 IPv4 地址。

有问题的行:

ip route 214.25.48.547 255.255.255.255 16.48.75.46 name Chicago-VPN

我目前拥有的匹配一个 IP 的正则表达式:

([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})

如果我在它的末尾加上一个 {3},它就会中断。我认为这与地址之间的空格有关,但我不知道如何处理。我需要捕获第三个地址。

https://regex101.com/r/mN3cR6/1

【问题讨论】:

  • 添加多行修饰符
  • 都在一条线上
  • 在 regex101 中将g 放在下一个文本字段中

标签: regex


【解决方案1】:

您只需要在代码中添加一个多行修饰符。

你的新代码应该是这样的

/([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})/g

看这个演示https://regex101.com/r/mN3cR6/2

【讨论】:

    【解决方案2】:

    试试

    ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\s?)+
    

    这应该匹配一个、两个或三个,甚至更多的“IP”。

    或者

    ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\s([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\s([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})
    

    正好是 3。

    或者

    ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\s?){3}
    

    对于一个较短的公式,可能存在一些错误。

    请注意,基本概念也存在问题,因为它匹配“999.999.999.999”,但它肯定不是有效的 IP 地址。

    【讨论】:

      【解决方案3】:

      下面要匹配第三个ip

      (?:[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\s){2}([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})
      

      根据您使用的语言,可能会更紧凑 - 例如在 ruby​​ 中

      string.scan(/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})/)[2] 
      

      会给你你想要的。您还可以折叠多个 [0-9]{1,3}。使用不匹配组和计数的实例

      【讨论】:

        【解决方案4】:

        问题是,正则表达式不仅需要包含 IP,还需要包含 IP 之间的空格。

        所以在重复组中添加一个空格应该可以解决问题:

        ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ){3}
        

        如果你不想在最后一场比赛中出现空间,你可以使用??(或*?)使其不贪婪:

        ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ??){3}
        

        另请注意,您的正则表达式匹配的不仅仅是有效 IP。例如999.999.999.999 会很好地匹配。

        【讨论】:

          【解决方案5】:

          您已经将所有三个 IP 与该正则表达式匹配。

          ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})

          第 1 场比赛

          1. 214.25.48.547

          第 2 场比赛

          1. 255.255.255.255

          第 3 场比赛

          1. 16.48.75.46

          你可以在这里测试它:

          http://rubular.com/

          问题可能在于您尝试访问它们的方式。

          在 Ruby 中,您的正则表达式可以完美运行:

          regex = /([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})/
          "ip route 214.25.48.547 255.255.255.255 16.48.75.46 name Chicago-VPN".scan(regex)
           => [["214.25.48.547"], ["255.255.255.255"], ["16.48.75.46"]]
          

          【讨论】:

            猜你喜欢
            • 2016-01-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-02-27
            • 2018-12-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多