【问题标题】:Match folder name from url using regex使用正则表达式从 url 匹配文件夹名称
【发布时间】:2009-07-15 07:58:41
【问题描述】:

我只想匹配文件所在的文件夹名称,

例如:
图片/2009/cat01.jpg
pic/2009/01/cat02.jpg

我只想匹配我用粗体输入的内容。

到目前为止,我有这个:

[^/]*/

哪个匹配,
pic/2009/cat01.jpg

有什么想法吗?

【问题讨论】:

    标签: regex bash shell


    【解决方案1】:

    不确定我是否理解您的要求,但试试这个:

    [^/]+(?=/[^/]+$)
    

    这将只匹配倒数第二个部分。


    说明:

    (?x)     # enable comment mode
    [^/]+    # anything that is not a slash, one or more times
    (?=      # begin lookahead
      /      # a slash
      [^/]+  # again, anything that is not a slash, once or more
      $      # end of line
    )        # end lookahead
    

    前瞻部分将不包含在匹配中(第 0 组)-(如果您的正则表达式引擎不执行前瞻,您可以省略前瞻但包含其内容,那么您只需要拆分 / 并获得第一个项目)。

    嗯...有一段时间没有做 bash 正则表达式了...您可能需要转义它:

    [^\/]+\(?=\/[^\/]+$\)
    

    【讨论】:

    • 也非常感谢,我使用这个网站已经有一段时间了,但今天才刚刚注册,我对自己获得解决方案的速度感到震惊。尽管如此,这对我使用 sed 不起作用: sed -E 's/[^\/]+(?=\/[^\/]+$)//g' 错误:sed: -e expression #1, char 26: 前面的正则表达式无效 [^\/]+\(?=\/[^\/]+$\) 什么都不做,它没有改变任何东西。但是您发布的顶部“[^/]+(?=/[^/]+$)”确实可以用作正则表达式,我可以稍后将它与 php 一起使用。 PS,感谢您详细说明每个部分的作用,我永远无法理解每个部分的作用。
    【解决方案2】:

    不使用正则表达式:

    FILE_NAME="pic/2009/cat01.jpg"
    basename $(dirname $FILE_NAME)
    

    dirname 获取路径的目录部分,basename 打印最后一部分。

    【讨论】:

    • 谢谢,完美。它不一定是正则表达式,这正是我认为你会用于这项工作的。
    【解决方案3】:

    在 bash 中不使用外部命令或正则表达式

    # FILE_NAME="pic/2009/cat01.jpg"
    # FILE_NAME=${FILE_NAME%/*}
    # # echo ${FILE_NAME##*/}
    2009
    

    【讨论】:

      【解决方案4】:

      我懒惰的回答:

      for INPUTS in pic/2009/cat01.jpg pic/2009/01/cat02.jpg ; do
        echo "Next path is $INPUTS";
        LFN="$INPUTS";
        for FN in `echo $INPUTS | tr / \ ` ; do
          PF="$LFN";
          LFN="$FN";
        done;
        echo "Parent folder of $FN is $PF";
      done;
      

      【讨论】:

        【解决方案5】:

        回声图片/2009/cat01.jpg | awk -F/'{print $(NF-1)}'

        【讨论】:

          【解决方案6】:

          这样的正则表达式应该可以解决问题:

          /\/([^\/]+)\/[^\/]+$/
          

          您所追求的值将在第一个捕获组中。

          【讨论】:

          • Peter Boughton (stackoverflow.com/questions/1130016/…) 提供的解决方案要好得多。
          • mmm 是的,这似乎可行,但我如何指定它应该使用哪个组? (我使用 sed,或者我应该使用 awk...)
          【解决方案7】:

          试试:

          /[a-z0-9_-]+
          

          这将标记从 / 开始的 URL 字符串中的所有文件夹,包括文件夹名称中包含“_”或“-”的文件夹。希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-01-22
            • 1970-01-01
            • 1970-01-01
            • 2021-07-28
            • 1970-01-01
            相关资源
            最近更新 更多