如何将带负向预查的Unix路径验证正则表达式转换为Google RE2语法以适配Kubernetes CRD校验
如何将带负向预查的Unix路径验证正则表达式转换为Google RE2语法以适配Kubernetes CRD校验
我明白你的问题了——Kubernetes CRD使用的Google RE2正则引擎不支持Perl风格的否定前瞻(也就是你原来用的(?!...)语法),所以得换一种不依赖前瞻的思路来实现同样的Unix路径校验逻辑。
先回顾下你的核心校验需求:
- 必须是绝对路径(以
/开头,或单独的/) - 禁止以
/proc、/dev、/sys、/run、/boot、/root这些目录开头(包括目录本身及其子路径) - 路径中不能包含空格
- 路径末尾可以带
/或不带
适配RE2的正则表达式
这里给出一个完全兼容RE2的正则,能覆盖你列出的所有测试用例:
^/$|^/([^pdsbr]|p[^r]|pr[^o]|pro[^c]|d[^e]|de[^v]|s[^y]|sy[^s]|r[^u]|ru[^n]|r[^o]|ro[^o]|roo[^t]|b[^o]|bo[^o]|boo[^t])[^/ ]*(/[^/ ]*)*/?$
正则逻辑拆解
这个正则通过正向匹配+枚举排除禁止前缀的方式实现,分为两个分支(用|分隔):
^/$:匹配单独的根路径/- 第二个分支匹配所有合法的非根绝对路径,核心逻辑拆解:
^/:确保路径是绝对路径([^pdsbr]|p[^r]|pr[^o]|pro[^c]|d[^e]|de[^v]|s[^y]|sy[^s]|r[^u]|ru[^n]|r[^o]|ro[^o]|roo[^t]|b[^o]|bo[^o]|boo[^t]):这部分用来精准排除禁止的顶级目录:[^pdsbr]:匹配首字母不是p/d/s/r/b的目录(这些是禁止目录的首字母)- 后面的
p[^r]、pr[^o]等:匹配首字母是禁止目录的首字母,但后续字符不构成完整禁止目录名的情况(比如/pabc是合法的,但/proc会被排除)
[^/ ]*:匹配目录名的剩余部分,确保没有空格和/(/[^/ ]*):匹配后续的子目录(可选,通过*实现)/?$:允许路径末尾带一个可选的/
测试验证
这个正则能完全匹配你列出的所有有效路径,同时拒绝所有无效路径:
- 有效路径:
/、/home、/home/、/home/username/、/home/username、/var→ 全部匹配成功 - 无效路径:
home、/root、/proc、/dev/等 → 全部匹配失败
在Kubernetes CRD中的使用示例
把这个正则放到你的CRD schema的pattern字段中即可:
apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: your-resources.example.com spec: group: example.com versions: - name: v1 served: true storage: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: targetPath: type: string pattern: '^/$|^/([^pdsbr]|p[^r]|pr[^o]|pro[^c]|d[^e]|de[^v]|s[^y]|sy[^s]|r[^u]|ru[^n]|r[^o]|ro[^o]|roo[^t]|b[^o]|bo[^o]|boo[^t])[^/ ]*(/[^/ ]*)*/?$' required: [targetPath] scope: Namespaced names: plural: your-resources singular: your-resource kind: YourResource
备注:内容来源于stack exchange,提问作者Mykhailo Shyshov
相关产品推荐
相关产品推荐

