如何用单个正则表达式匹配指定目录文件及一级子目录的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
相关产品推荐
相关产品推荐

