【问题标题】:Regex: match everything before image正则表达式:匹配图像之前的所有内容
【发布时间】:2012-03-27 18:55:30
【问题描述】:

url1:/dir-images/no1/top-left.gif
url2:/test-1/test-2/test

如果是图像文件(url1),我想匹配最后一个斜杠之前的路径,又名/dir-images/no1/ 如果不是(url2),则匹配整个路径,/test-1/test-2/test

试过^([\=\/\.\w-]+\/)+这可以在最后一个斜杠之前得到路径,不管它后面是什么..

【问题讨论】:

    标签: regex inverse


    【解决方案1】:

    试试:

    ^([\=/.\w-]+/)+((?!.*\.gif$).*|)
    

    (?!) 的部分是前瞻。这有点像 if 语句。有两种不同的前瞻,?=?!。第一个是正常的 if,第二个是'if not'。

    在你的情况下,我只是问结尾不是gif吗?然后我匹配所有内容。

    【讨论】:

    • 谢谢!我的问题是,如果结尾是 .gif,它是否与最后一个斜杠之前的路径匹配?因为在我的正则表达式工具中,它不会匹配任何东西。
    • @user1296363 你只想知道整个事情是否以 .gif 结尾?然后试试 '\.gif$'
    • @ruakh 我没有得到第一部分。我刚刚用管道解决了另一个问题,我完全忘记了。
    【解决方案2】:

    一种方式(perl 风格):

    m|\A(.*/(?(?!.*\.gif$).*))|
    

    解释:

    m| ... |              # Regexp.
    \A                    # Begin of line.
    (                     # Group 1.
      .*/                 # All characters until last slash.
      (?                  # Conditional expression.
        (?!.*\.gif$)      # If line doesn't end with '.gif', match...
        .*)               # ... until end of line.
    )
    

    测试中...

    script.pl的内容:

    use warnings;
    use strict;
    
    while ( <DATA> ) { 
        printf qq[%s\n], $1 if m|\A(.*/(?(?!.*\.gif$).*))|;
    }
    
    __DATA__
    /dir-images/no1/top-left.gif
    /test-1/test-2/test
    

    像这样运行它:

    perl script.pl
    

    结果如下:

    /dir-images/no1/
    /test-1/test-2/test
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 2012-12-05
      • 1970-01-01
      • 2011-04-13
      • 2011-05-25
      • 2021-05-26
      • 2022-08-21
      相关资源
      最近更新 更多