1

我正在对驱动器上的几个文件夹进行分类,我想使用这个正则表达式清除低质量的文件(这有效):

xvid|divx|480p|320p|DivX|XviD|DIVX|XVID|XViD|DiVX|DVDSCR|PDTV|pdtv|DVDRip|dvdrip|DVDRIP

现在有些文件名是高清的,但文件名中仍然有 DVD 或 XviD,但也有 1080p、720p、1080i 或 720i。我需要一个正则表达式来匹配上面的那个,但排除这些词 1080p、720p、1080i 或 720i。

4

3 回答 3

2

使用两个正则表达式

查找是否匹配

1080p|720p|1080i|720i

然后,如果没有,即没有找到上述匹配项,请检查匹配项:

xvid|divx|480p|320p|DivX|XviD|DIVX|XVID|XViD|DiVX|DVDSCR|PDTV|pdtv|DVDRip|dvdrip|DVDRIP

正则表达式不支持反向匹配,您可以使用否定的环顾四周,但对于这项任务,我不会说它们是合适的。当您检查 的所有情况时1080p-divx,您会向前看,但是它没有抓住divx-10bit-1080p,您无法在简单的正则表达式中实现这一点。

于 2013-05-08T13:26:48.933 回答
1

您可以为此使用负前瞻

^(?!.*(?:1080p|720p|1080i|720i)).*(?:xvid|divx|480p|320p|DivX|XviD|DIVX|XVID|XViD|DiVX|DVDSCR|PDTV|pdtv|DVDRip|dvdrip|DVDRIP)

这将匹配您的搜索字符串,但如果1080p|720p|1080i|720i字符串中也有则失败。

于 2013-05-08T13:27:03.620 回答
0

你可以这样做:

<pre><?php
$subjects = array('Arrival of the train at La Ciotat station.avi',
                  'Gardenator II - multi - DVDrip - 720i.mkv',
                  'The adventures of Roberto the bear - divx.avi',
                  'Tokyo’s Ginza District - dvdrip.mkv');

$pattern = '~(?(DEFINE)(?<excl>(?>d(?>vd(?>rip|scr)|ivx)|pdtv|xvid|320p|480p)))
             (?(DEFINE)(?<keep>(?>[^17]+?|1(?!080[ip])|7(?!20[ip]))))
             ^\g<keep>*\g<excl>\g<keep>*$  ~ix';

foreach($subjects as $subject) {
    if (preg_match($pattern, $subject)) echo $subject."\n"; }

主要兴趣是避免对每个字符进行前瞻测试。

于 2013-05-08T15:46:01.097 回答