以下模式将捕获具有后缀和指定扩展名的文件名。
'/(.+?)(@2x|~ipad|@2x~ipad)\.(jpg|png)/mi'
这是文件的示例列表
SLN0098H@2x.JPG
SLN0098H~ipad.JPG
SLN0098H_thumb@2x~ipad.JPG
SLN0098H_thumb@2x.JPG
SLN0098H_thumb~ipad.JPG
SLN0099H@2x~ipad.JPG
SLN0099H@2x.JPG
SLN0099H~ipad.JPG
SLN0098H_t@2x.JPG
SLN0098H_cover@2x.JPG
但是,我想在文件名解析后缀之前排除那些包含_cover
,_thumb
,_t
,_c
的行。是否可以在正则表达式中进行,还是必须手动循环和过滤?
答案 0 :(得分:3)
您可以使用正则表达式丢弃技术。
例如使用此正则表达式:
.*(?:_cover|_thumb|_t|_c)|^(?:(.+?)(@2x|~ipad|@2x~ipad)\.(jpg|png))$
<强> Working demo 强>
想法是使用这种技术:
弃掉patt1 |丢弃patt1 |丢弃patt1 | (需要抓取内容)&lt; - 请注意,最后一场比赛是一个捕获组。
因此,对于您的情况,这个想法是:
Discard below patterns:
.* Whatever content that contains:
( _cover '_cover'
| OR
_thumb '_thumb'
| OR
_t '_t'
| OR
_c '_c'
)
But keep the pattern you want:
|^(?:(.+?)(@2x|~ipad|@2x~ipad)\.(jpg|png))$
Debuggex在展示这项技术方面表现非常出色:
在此图片中,您可以清楚地看到您想要的内容是通过捕获组捕获的,而上面的模式意味着丢弃所有这些匹配。对我而言,这是一种非常出色的技术,可以帮助正则表达式保持清洁。
希望能提供帮助
答案 1 :(得分:1)
您可以使用否定前瞻来避免匹配少数字符串:
/^((?!.*?_(?:cover|thumb|t|c)\b).+?)(?:@2x|~ipad|@2x~ipad)\.(?:jpg|png)$/mi
此处((?!.*?_(?:cover|thumb|t|c)\b)
是否定前瞻,如果输入中包含任何_cover, _thumb, _t, _c
,则会避免匹配输入,