正则表达式匹配" \。fbcdn \ .net"但不匹配" .xyz。{0,20} \。fbcdn \ .net"

时间:2017-07-22 10:13:28

标签: regex regex-group

序言

我在一个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的流不匹配。

1 个答案:

答案 0 :(得分:1)

[^instagram.{1,20}]是一个否定的字符类。它没有做你认为它做的事情。在字符类中,没有分组或量词。每个字符都是单个文字字符,如果第一个字符是^,那么它匹配任何不是字符类中使用的字符之一的字符。对于此示例,它匹配不在此列表中的字符: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

如果没有超前支持,您可以使用带有否定字符类的长正则表达式:

^(?:[^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