消极的背后或其他什么?

时间:2014-08-26 14:21:56

标签: regex regex-lookarounds

以下模式将捕获具有后缀和指定扩展名的文件名。 '/(.+?)(@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。是否可以在正则表达式中进行,还是必须手动循环和过滤?

2 个答案:

答案 0 :(得分:3)

您可以使用正则表达式丢弃技术。

例如使用此正则表达式:

.*(?:_cover|_thumb|_t|_c)|^(?:(.+?)(@2x|~ipad|@2x~ipad)\.(jpg|png))$

<强> Working demo

想法是使用这种技术:

  

弃掉patt1 |丢弃patt1 |丢弃patt1 | (需要抓取内容)&lt; - 请注意,最后一场比赛是一个捕获组。

enter image description here

因此,对于您的情况,这个想法是:

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在展示这项技术方面表现非常出色:

Regular expression visualization

在此图片中,您可以清楚地看到您想要的内容是通过捕获组捕获的,而上面的模式意味着丢弃所有这些匹配。对我而言,这是一种非常出色的技术,可以帮助正则表达式保持清洁。

希望能提供帮助

答案 1 :(得分:1)

您可以使用否定前瞻来避免匹配少数字符串:

/^((?!.*?_(?:cover|thumb|t|c)\b).+?)(?:@2x|~ipad|@2x~ipad)\.(?:jpg|png)$/mi

RegEx Demo

此处((?!.*?_(?:cover|thumb|t|c)\b)否定前瞻,如果输入中包含任何_cover, _thumb, _t, _c,则会避免匹配输入,