Regex 使用正则表达式从url匹配文件夹名称

Regex 使用正则表达式从url匹配文件夹名称,regex,bash,shell,Regex,Bash,Shell,我只想匹配文件所在的文件夹名 例如: pic/2009/cat01.jpg pic/2009/01/cat02.jpg 我只想匹配我用粗体写的内容 到目前为止,我有: 哪个匹配, pic/2009/cat01.jpg 有什么想法吗?我不知道你在问什么,但试试这个: [^/]+(?=/[^/]+$) 这将只匹配第二个到最后一个部分 说明: (?x) # enable comment mode [^/]+ # anything that is not a slash, one or

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

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

我只想匹配我用粗体写的内容

到目前为止,我有:

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


有什么想法吗?

我不知道你在问什么,但试试这个:

[^/]+(?=/[^/]+$)
这将只匹配第二个到最后一个部分


说明:

(?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
lookahead部分将不包括在匹配中(组0)-(您可以省略lookahead,但包括其内容,如果您的正则表达式引擎不进行lookahead,那么您只需要拆分/并获取第一项)

嗯。。。有段时间没做bash正则表达式了。。。您可能需要避开它:

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

这样的正则表达式应该可以实现以下功能:

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

您要查找的值将位于第一个捕获组中。

不使用正则表达式:

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

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

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

# FILE_NAME="pic/2009/cat01.jpg"
# FILE_NAME=${FILE_NAME%/*}
# # echo ${FILE_NAME##*/}
2009
我懒散的回答:

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;

echo pic/2009/cat01.jpg | awk-F/{print$(NF-1)}

试试:

/[a-z0-9_-]+

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

Peter Boughton()提供的解决方案要好得多。嗯,是的,这似乎有效,但我如何指定它应该使用哪个组?(我在使用sed,还是应该使用awk…)谢谢,这很好用。它不必是正则表达式,这正是我认为你会使用的工作。同样感谢,我已经使用这个网站一段时间了,但今天才注册,我对我的解决方案的速度感到震惊。虽然这对我使用sed不起作用:sed-E的//[^\/]+(?=\/[^\/]+$)//g'错误:sed:-E表达式1,char 26:无效的前一个正则表达式[^\/]+(?=\/[^\/]+$)没有任何作用,它没有改变任何东西。但是您发布的最上面的“[^/]+(?=/[^/]+$)”确实可以作为正则表达式使用,我可以在以后的php中使用它。PS,谢谢你详细解释了每一部分的作用,我永远无法理解每一部分的作用。
/[a-z0-9_-]+