我一直试图在Google Analytics中排除四个IP范围(编辑:只有第三个八位位组,范围从1-128。第四个是“静态”,如下所述)。我使用Google Analytics可以使用的正则表达技巧并不是最好的。我希望在这里得到一些帮助,如何构建我的正则表达式,以便它做我想要的。
我希望排除的IP范围是:
10.130.1.0 - 10.130.128.0,
10.130.1.99 - 10.130.128.99
10.132.1.0 - 10.132.128.0
10.132.1.1 - 10.132.128.1。
如您所见,有一些静态部分和一些更“动态”。
我创建的完整正则表达式看起来像这样(将它分开以便于阅读,但它实际上是在一行上):
^ 10.130([1-9] | [1-9] [0-9] | 1([0-1] [0-9] | 2 [0-8]))。10 |
10.130([1-9] | [1-9] [0-9] | 1([0-1] [0-9] | 2 [0-8]))。99 |
10.132([1-9] | [1-9] [0-9] | 1([0-1] [0-9] | 2 [0-8]))。0 |
10.132。([1-9] | [1-9] [0-9] | 1([0-1] [0-9] | 2 [0-8]))1 $
我做得对吗?我还没有真正完全掌握分组()
,或者如果我需要将不同范围的每个单独部分组合在一起,例如(10\.130\.([1-9]|[1-9][0-9]|1([0-1][0-9]|2[0-8]))\.0)
,或者保持原样{没有()
}?
我是否正确分组并且这是一个很好的方法吗?
答案 0 :(得分:4)
问题中的ip地址范围混淆,意图可能是:
10.130.1.0 - 10.130.128.99
10.132.1.0 - 10.132.128.1
这个答案基于这样的假设 - 我已经阅读了关于只想将范围应用到第三个八位字节的评论,但很可能这是一个误解(或者说这实际上是意图 - 但它是未来读者不太可能如此。)
IP范围可表示为:
10.130.1.0 - 10.130.127.254*
10.130.128.0 - 10.130.128.99
10.132.1.0 - 10.132.127.254*
10.132.128.0 - 10.132.128.1
请注意,标有星号的两个范围涵盖了最后一个八位字节的整个范围,因此在任何数字符合条件的模式中都是如此。因此在伪正则表达式中需要的是:
10.130.[1 to 127].*
10.130.128.[0 to 99]
10.132.[1 to 127].*
10.132.128.[0 or 1]
每个范围都需要是一个正则表达式,用于处理构成这些数字的数字。
有一到三个数字,在使用正则表达式处理时会有一些复杂性 - 但它可以像这样分解:
[1-9] # 1-9
[0-9]{2} # 10-99
1[0-1][0-9] # 100 - 119
12[0-7] # 120-127
或者:
([1-9]|[0-9]{2}|1[0-1][0-9]|12[0-7])
这个很容易,因为它是一个或两个数字:
[0-9]{1,2}
也很简单:
[0-1]
因此,作为一个完整的正则表达式,整个范围可以表示为:
^10\.(
130\.([1-9]|[0-9]{2}|1[0-1][0-9]|12[0-7])\.[0-9]{1,3} |
130\.128\.[0-9]{1,2} |
132\.([1-9]|[0-9]{2}|1[0-1][0-9]|12[0-7])\.[0-9]{1,3} |
132\.128\.[0-1]
)$
请注意,将正则表达式锚定到字符串的末尾是一个好主意,否则就是一个ip地址,例如
10.130.128.111
^^^^^^^^^^^^^
超出定义范围的将匹配,忽略最后一位数。
Google不太可能提交无效的IP地址,因此可以对上述正则表达式进行一些简化 - [0-9]
和[1-9]
可以同等对待,这意味着:
[1-9] # 1-9
[0-9]{2} # 10-99
变为:
[0-9]{1,2} # 1-99, one or two digits
因此,正则表达式可以表示为稍微简单一些:
^10\.(
130\.([0-9]{1,2}|1[0-1][0-9]|12[0-7])\.[0-9]{1,3} |
130\.128\.[0-9]{1,2} |
132\.([0-9]{1,2}|1[0-1][0-9]|12[0-7])\.[0-9]{1,3} |
132\.128\.[0-1]
)$
此外,[0-9]
可以写成\d
,然后使正则表达式略微冗长::
^10\.(
130\.(\d{1,2}|1[0-1]\d|12[0-7])\.\d{1,3} |
130\.128\.\d{1,2} |
132\.(\d{1,2}|1[0-1]\d|12[0-7])\.\d{1,3} |
132\.128\.[0-1]
)$
答案 1 :(得分:1)
你做得对,你拥有它的方式。我不知道你是否试图匹配包含或排除 - 我假设排除 - 只要你知道^
是锚,匹配一个开头-string,而不是仅存在于字符类中的否定运算符。
我认为这更容易阅读,但是:
^10\.130\.([1-9][0-9]?|1[01][0-9]|12[0-8])\.(0|99)$
^10\.132\.([1-9][0-9]?|1[01][0-9]|12[0-8])\.(0|1)$