You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单个正则表达式匹配指定目录文件及一级子目录的index文件?

问题

我有一组URI和一个参数$path,希望基于$path匹配URI,需求是获取$path目录下的所有文件,以及仅一级子目录中的index文件,不匹配更深层级子目录内的index文件。

当$path = /root时,匹配规则示例如下:

/root/index.shtml           - 匹配(位于$path目录下)
/root/root_one.shtml        - 匹配(位于$path目录下)
/root/one/index.shtml       - 匹配(一级子目录的index文件)
/root/two/index.shtml       - 匹配(一级子目录的index文件)
/root/two/test.shtml        - 不匹配
/root/two/three/index.shtml - 不匹配
/root/2024/index.shtml      - 匹配(一级子目录的index文件)
/root/2024/one.shtml        - 不匹配

根据我的现有知识,原本需要使用两个正则表达式来实现全部匹配:

  • 匹配目录内所有文件:\/root\/(\w+)\.shtml
  • 匹配一级子目录的index.shtml:\/root\/(\w+)\/{1}index\.shtml

请问是否可以用单个正则表达式实现上述两种匹配?

更新:我在更新问题时想到了一个解决方案:\/root\/(\w+)(\/{1}index\.shtml|\.shtml)

解决方案

可以用单个正则表达式实现,你想到的这个表达式已经能满足需求,还可以做一点简化:把\/{1}改成\/(量词{1}表示匹配一次,是默认规则,可省略),简化后的正则为:\/root\/(\w+)(\/index\.shtml|\.shtml)

我们拆解下这个正则的匹配逻辑:

  • \/root\/:匹配固定的根路径前缀
  • (\w+):匹配/root下的文件名(比如index、root_one)或者一级子目录名(比如one、two、2024)
  • (\/index\.shtml|\.shtml):通过分支匹配两种合法场景:
    • \/index\.shtml:匹配一级子目录下的index.shtml文件
    • \.shtml:匹配/root目录下的任意.shtml文件

对照示例验证:

  • /root/index.shtml:匹配\.shtml分支,符合要求
  • /root/root_one.shtml:匹配\.shtml分支,符合要求
  • /root/one/index.shtml:匹配\/index\.shtml分支,符合要求
  • /root/two/test.shtml:一级子目录下的非index.shtml文件,不匹配
  • /root/two/three/index.shtml:存在二级子目录,超出正则允许的路径层级,不匹配
  • /root/2024/index.shtml:匹配\/index\.shtml分支,符合要求
  • /root/2024/one.shtml:一级子目录下的非index.shtml文件,不匹配

如果后续需要适配任意$path而非固定/root,只需将正则中的\/root\/替换为对应$path的正则片段即可,当前场景下这个正则完全满足需求。

内容的提问来源于stack exchange,提问作者feumw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:20:15