序言
我在一个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的流不匹配。
答案 0 :(得分:1)
[^instagram.{1,20}]
是一个否定的字符类。它没有做你认为它做的事情。在字符类中,没有分组或量词。每个字符都是单个文字字符,如果第一个字符是^
,那么它匹配任何不是字符类中使用的字符之一的字符。对于此示例,它匹配不在此列表中的字符: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
如果没有超前支持,您可以使用带有否定字符类的长正则表达式:
^(?:[^i]|i[^n]|in[^s]|ins[^t]|inst[^a]|insta[^g]|instag[^r]|instagr[^a]|instagra[^m]|instagram[^.]).{1,30}\.fbcdn\.net$