匹配 "\.fbcdn\.net" 但不匹配 ".xyz.{0,20}\.fbcdn\.net" 的正则表达式
A regex to match "\.fbcdn\.net" but not match ".xyz.{0,20}\.fbcdn\.net"
序言:
我在一个 pcap 文件中有一堆 TLS 连接。这些 TLS 流量用于 Instagram 或 Facebook。我想在他们的 TLS 握手的 SNI(服务器名称指示)上使用两个(或更多)正则表达式模式将它们分为两组。
问题:
SNI字符串如下:
对于 Instagram:
instagram.fsst1-2.fna.fbcdn.net
instagram.acd.yc.fbcdn.net
instagram.xffuyw-34.hj.fbcdn.net
对于 Facebook:
static.xx.fbcdn.net
dyna.yudhn.fbcdn.net
asq.iud.fbcdn.net
正如您在上面看到的,这两个组的 SNI 中都有 fbcdn.net
。这些组之间的明显区别是 Instagram 的 SNI 在其 SNI 中有 instagram
。
我可以用哪些模式来分类这个流?
请注意,我必须在两种模式中都有 fbcdn
,以避免与其他非 Instagram 和非 Facebook 模式不匹配。
到目前为止尝试失败
Instagram:
/instagram.{1,20}\.fbcdn\.net/s
脸书
/[^instagram.{1,20}]\.fbcdn\.net/s
上面的 facebook 模式与 facebook 的流不匹配。
[^instagram.{1,20}]
是一个否定字符class。它不做你认为它正在做的事情。在字符 class 内没有分组或量词。每个字符都是内部的单个文字字符,如果第一个字符是 ^
,那么它匹配任何不是字符 class 中使用的字符之一的字符。对于此示例,它匹配不在此列表中的字符:i,n,s,t,a,g,r,a,m,.,{,1,2,0,}
(不包括逗号)
根据您的需要,您可以在此处使用负前瞻:
^(?!instagram\.).{1,20}\.fbcdn\.net$
(?!instagram\.)
是行起始锚点之后的否定先行断言。这将跳过所有以 instagram.
开头的行
Read more about lookahead and lookbehind
如果没有前瞻支持,您可以使用带否定字符的长正则表达式 classes:
^(?:[^i]|i[^n]|in[^s]|ins[^t]|inst[^a]|insta[^g]|instag[^r]|instagr[^a]|instagra[^m]|instagram[^.]).{1,30}\.fbcdn\.net$
序言:
我在一个 pcap 文件中有一堆 TLS 连接。这些 TLS 流量用于 Instagram 或 Facebook。我想在他们的 TLS 握手的 SNI(服务器名称指示)上使用两个(或更多)正则表达式模式将它们分为两组。
问题:
SNI字符串如下:
对于 Instagram:
instagram.fsst1-2.fna.fbcdn.net
instagram.acd.yc.fbcdn.net
instagram.xffuyw-34.hj.fbcdn.net
对于 Facebook:
static.xx.fbcdn.net
dyna.yudhn.fbcdn.net
asq.iud.fbcdn.net
正如您在上面看到的,这两个组的 SNI 中都有 fbcdn.net
。这些组之间的明显区别是 Instagram 的 SNI 在其 SNI 中有 instagram
。
我可以用哪些模式来分类这个流?
请注意,我必须在两种模式中都有 fbcdn
,以避免与其他非 Instagram 和非 Facebook 模式不匹配。
到目前为止尝试失败
Instagram:
/instagram.{1,20}\.fbcdn\.net/s
脸书
/[^instagram.{1,20}]\.fbcdn\.net/s
上面的 facebook 模式与 facebook 的流不匹配。
[^instagram.{1,20}]
是一个否定字符class。它不做你认为它正在做的事情。在字符 class 内没有分组或量词。每个字符都是内部的单个文字字符,如果第一个字符是 ^
,那么它匹配任何不是字符 class 中使用的字符之一的字符。对于此示例,它匹配不在此列表中的字符:i,n,s,t,a,g,r,a,m,.,{,1,2,0,}
(不包括逗号)
根据您的需要,您可以在此处使用负前瞻:
^(?!instagram\.).{1,20}\.fbcdn\.net$
(?!instagram\.)
是行起始锚点之后的否定先行断言。这将跳过所有以 instagram.
Read more about lookahead and lookbehind
如果没有前瞻支持,您可以使用带否定字符的长正则表达式 classes:
^(?:[^i]|i[^n]|in[^s]|ins[^t]|inst[^a]|insta[^g]|instag[^r]|instagr[^a]|instagra[^m]|instagram[^.]).{1,30}\.fbcdn\.net$