【问题标题】:Negative lookbehind or something else?负面回顾或其他?
【发布时间】:2014-08-26 14:21:56
【问题描述】:

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

【问题讨论】:

    标签: regex regex-lookarounds


    【解决方案1】:

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

    例如使用这个正则表达式:

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

    Working demo

    这个想法是使用这种技术:

    丢弃 patt1 |丢弃 patt1 |丢弃 patt1 | (需要抓取内容)

    所以,对于你的情况,这个想法是:

    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 很好地展示了这种技术:

    在这张图片中,您可以清楚地看到您想要的内容是通过捕获组捕获的,而上述模式意味着丢弃所有这些匹配项。对我来说,这是一种很好的技术,可以帮助正则表达式变得非常干净。

    希望能帮到你

    【讨论】:

    • 感谢您的详细回答,但这并不能过滤掉不需要的项目(包含 _c、_t 等)。它捕捉一切。
    • @Pablo 你必须查看比赛信息regex101.com/r/fK9xY0/1。该技术是使用捕获组的内容。在我的答案截图中,绿色的火柴是被抓住的火柴。你可以把你想要的正则表达式我只使用你的正则表达式,但在开头添加了丢弃的模式
    • 对不起,这里最初是错误的评论,所以我后来更正了。你的技术很好地抓住了群体,但没有丢弃那些有 _t、_c 匹配的人……我根本不需要捕捉那些行。
    • @Pablo 您可以在屏幕截图中看到 SLN0098H_t@2x.JPG 被丢弃并且 SLN0098H_cover@2x.JPG 也被丢弃。我用红色箭头标记了它。顺便说一句,我也把链接放到working demo
    • 我认为我们不在同一个页面上。您可以在屏幕截图中看到“丢弃”行的第一部分仍然被捕获。我需要完全忽略这些行。在您的正则表达式中,它们是匹配的!
    【解决方案2】:

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

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

    RegEx Demo

    这里的((?!.*?_(?:cover|thumb|t|c)\b)负前瞻,如果输入中包含任何_cover, _thumb, _t, _c,它将避免匹配输入,

    【讨论】:

    • 您发现它捕获了哪些不需要的项目?
    • 包含 _c、_t 等的行
    • 哦,您只需要使用锚点 ^$(请参阅带有演示链接的更新正则表达式)
    • 我们去!现在这就是我要找的。​​span>
    • @Pablo:这个正则表达式在某种程度上不符合您的要求吗?
    猜你喜欢
    • 2013-08-03
    • 2016-09-07
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2018-01-02
    相关资源
    最近更新 更多