多个子域时具有TLD的正则表达式域

时间:2017-06-24 00:04:07

标签: regex subdomain

我有很长的域名列表,其子域名如下:

ffmpeg version N-82597-gd316b21 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib
  libavutil      55. 40.100 / 55. 40.100
  libavcodec     57. 66.106 / 57. 66.106
  libavformat    57. 58.100 / 57. 58.100
  libavdevice    57.  2.100 / 57.  2.100
  libavfilter     6. 67.100 /  6. 67.100
  libswscale      4.  3.101 /  4.  3.101
  libswresample   2.  4.100 /  2.  4.100
  libpostproc    54.  2.100 / 54.  2.100
[adp @ 0000000000026380] Format adp detected only with low score of 25, misdetection possible!
Input #0, adp, from 'input.MTS':
  Duration: 00:05:38.69, start: 0.000000, bitrate: 438 kb/s
    Stream #0:0: Audio: adpcm_dtk, 48000 Hz, stereo, s16p
Output #0, mp4, to 'output.mp4':
  Metadata:
    encoder         : Lavf57.58.100
    Stream #0:0: Audio: aac (LC) ([64][0][0][0] / 0x0040), 48000 Hz, stereo, fltp, 128 kb/s
    Metadata:
      encoder         : Lavc57.66.106 aac
Stream mapping:
  Stream #0:0 -> #0:0 (adpcm_dtk (native) -> aac (native))
Press [q] to stop, [?] for help
size=     312kB time=00:05:38.68 bitrate=   7.6kbits/s speed=33.7x
video:0kB audio:250kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 25.134468%
[aac @ 00000000025c5ba0] Qavg: 65531.879

每个条目的0和几个子域之间(例如www.random.com abc.api.random.co.uk abc.def.api.random.ac.za something.edu another.random.net random.pharmacy )。我试图弄清楚如何只提取域名和TLD。例如,鉴于上述输出,我正在寻找:

abc.def.api.random.ac.za

这有点超出了我目前对正则表达式的理解。看来我们需要检查一下:

2 个答案:

答案 0 :(得分:0)

你需要的正则表达式是:

\w+(?:\.\w\w)?\.\w+$

是:

  • \w+表示一个或多个字母或数字
  • (?:\.\w\w)?是一个可选组,匹配句点后跟两个字母
  • \.\w+匹配句点和剩余字母
  • $是该行的结尾

请参阅demo

如果你想减少通用性:

\w+(?:\.(?:co|ac))?\.\w+$

如果您想更加精确,则需要指定具有句点的整个eTLD(有效的顶级域名):

\w+(?:\.(?:co\.uk|ac\.za)|\.\w+)$

请参阅demo

如果您想了解所有有效的顶级域名,Mozilla基金会有一个名为Public Suffix List的精美目录。

答案 1 :(得分:0)

再多一点思考。

您可以使用*(零或更多)和+(一个或多个)重复,但您也可以指定范围{x,y}(x或更多,但不超过y)。

这可能很有用,因为倒数第二个域很可能是你的tld的一部分,如果它只有2个字符长。

你肯定想使用$(行尾)标记作为horcrux指出,因为你将从右侧工作。

\ W +。(\ W {2}。)?\ W + $

(...)?表示捕获组中的任何内容都是可选的。所以它正在寻找精确的2个字母后跟一个小数,作为一个可选的中间条目。