我正在对驱动器上的几个文件夹进行分类,我想使用此正则表达式清除低质量文件(这可行):
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。
答案 0 :(得分: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
,你无法在简单正则表达式中实现这一点
答案 1 :(得分:1)
您可以使用negative lookahead进行此操作
^(?!.*(?:1080p|720p|1080i|720i)).*(?:xvid|divx|480p|320p|DivX|XviD|DIVX|XVID|XViD|DiVX|DVDSCR|PDTV|pdtv|DVDRip|dvdrip|DVDRIP)
这将匹配您的搜索字符串,但如果字符串中还有1080p|720p|1080i|720i
则会失败。
答案 2 :(得分: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"; }
主要的兴趣是避免在每个角色上测试前瞻。