如何构建可匹配两类内部URL的正则表达式(适用于BASH脚本)
解决BASH中匹配两级/多级内部URL路径的正则问题
你的问题出在原正则的结构上:/\w+\/.+\/[\w\-]+/ 要求路径里至少包含两个斜杠(因为有两个明确的\/),所以像category/subcategory这种只有一个斜杠的两级路径自然被排除在外。
要同时匹配两级和多级的内部路径,我们可以调整正则的逻辑,让它允许至少一个斜杠,同时保持路径段的规则(根据你的示例,路径段允许字母、数字、下划线和连字符)。
推荐的正则表达式
^[\w\-]+(?:\/[\w\-]+)+$
正则拆解
^:匹配字符串开头(确保我们匹配的是完整路径,而非文本片段)[\w\-]+:匹配第一个路径段,允许字母、数字、下划线和连字符(?:\/[\w\-]+)+:非捕获组,匹配一个或多个「斜杠+路径段」的组合——这就实现了:- 匹配两级路径(比如
category/subcategory:1次「斜杠+路径段」) - 匹配多级路径(比如
category/subcategory/sub-subcategory/item-1:3次「斜杠+路径段」)
- 匹配两级路径(比如
$:匹配字符串结尾(避免部分匹配,比如category/subcategory/extra不会被误判为有效路径)
BASH脚本中的使用示例
你可以用BASH的=~操作符来测试匹配:
# 测试两级路径 test_path="category/subcategory" if [[ $test_path =~ ^[\w\-]+(?:\/[\w\-]+)+$ ]]; then echo "✅ 两级路径匹配成功" else echo "❌ 两级路径匹配失败" fi # 测试多级路径 test_path="category/subcategory/sub-subcategory/item-1" if [[ $test_path =~ ^[\w\-]+(?:\/[\w\-]+)+$ ]]; then echo "✅ 多级路径匹配成功" else echo "❌ 多级路径匹配失败" fi
可选调整:允许路径段包含特殊字符
如果你需要兼容原正则中.+的逻辑(即路径段允许任意非换行字符),可以把正则改成:
^\w+(?:\/.+)+$
不过这个版本会匹配比如category/subcategory/!@#$这类可能不符合预期的路径,所以更推荐前面严谨的版本。
内容的提问来源于stack exchange,提问作者eera5607
相关产品推荐
相关产品推荐

