【问题标题】:how can i get 3rd number phrase ip address(v4) using regular expression如何使用正则表达式获取第三个数字短语 ip 地址(v4)
【发布时间】:2012-10-27 01:52:35
【问题描述】:

我想从 IP 地址获取第三个数字(v4) 只使用正则表达式。

这里有很多ips

172.23.34.159
172.23.34.51
211.234.202.246
147.6.41.120
172.23.34.171
10.225.149.118
172.23.34.64

这可能吗?

【问题讨论】:

  • 如果我们知道你用什么语言做这件事会很有帮助。正则表达式本身只是匹配一个模式。从正则表达式中“获取”某些内容的方式取决于您用于应用匹配的函数。
  • @ghoti 我使用 oracle SQL 来过滤列。想做像 123.456.***.1

标签: regex parsing ip-address


【解决方案1】:

这至少应该适用于

\b\d{1,3}\.\d{1,3}\.\K\d{1,3}(?=\.\d{1,3}\b)

或者如果你想要更强大的东西:

\b(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]?)\.\K(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]?)\b)

你可以试试

$ re='\b(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]?)\.\K(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]?)\b)'
$
$ perl -lne 'print $& if /'"$re"'/' file.txt
34
34
202
41
34
149
34
$ 
$ grep -oP "$re" file.txt
34
34
202
41
34
149
34

【讨论】:

    【解决方案2】:

    在 BRE 中:

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

    或者在 ERE 中:

    /^[0-9]+\.[0-9]+\.([0-9]+)\.[0-9]+$/
    

    如果您在较旧的操作系统上使用 sed 之类的东西,您可能会被限制为 BRE。请注意,并非所有正则表达式实现都包含反向引用,因此您可能会更早地使用正则表达式以外的其他方法来获取此信息。例如在awk:

    [ghoti@pc ~]$ echo "10.11.12.13" | awk -F. '{print $3}'
    12
    

    或者只是纯粹的 bash:

    [ghoti@pc ~]$ addr="10.11.12.13"
    [ghoti@pc ~]$ addr=${addr#*.*.}
    [ghoti@pc ~]$ addr=${addr%.*}
    [ghoti@pc ~]$ echo $addr
    12
    

    【讨论】:

      【解决方案3】:

      当涉及到正则表达式时,您对数据了解得越多,您就越有能力解析/修改它。例如,如果您有一个数组或一个您已经知道仅包含 IP 地址的受信任文件,那么简单(在 Perl 中):

          my @ips = qw(172.23.34.159
                       172.23.34.51
                       211.234.202.246
                       147.6.41.120
                       172.23.34.171
                       10.225.149.118
                       172.23.34.64);
          for (@ips) {
              print "$1\n" if $_ =~ /(?:\d+\.){2}(\d+)\.\d+/;
          }
      

      要么

       而 () {
              打印 $1\n" 如果 $_ =~ /^\s*(?:\d+\.){2}(\d+)\.\d+\s*$/;
          }
      

      就够了。而如果您从外部来源或具有许多不同数据类型的文件收集数据,则需要更加严格(在这种情况下,sputnick 已经提供了适当严格的示例)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-20
        • 2017-03-15
        相关资源
        最近更新 更多