匹配 "\.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:

对于 Facebook:

正如您在上面看到的,这两个组的 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$

RegEx Demo

(?!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$

RegEx Demo 2