MongoDB JSON Schema正则匹配有效字符串失败问题排查
解决MongoDB JSON Schema中RGBA正则不匹配的问题
这个问题我之前也碰到过!MongoDB的JSON Schema对正则表达式的转义规则和Node.js里的有所不同,核心原因是JSON字符串本身的转义要求——你得把正则里的反斜杠再转义一次才行。
问题根源
Node.js里的正则表达式是直接作为正则字面量处理的,但MongoDB的JSON Schema是用JSON格式定义的,JSON字符串会把单个\解析为转义符,所以如果你的正则里需要用到\(比如转义括号、匹配数字的\d),必须在JSON里写成\\才能让MongoDB的正则引擎正确识别。
需要转义的字符
你的原正则里有几个需要调整的地方:
- 匹配字面量
(和)的部分:原正则用[(]和[)],其实等价于正则里的\(和\),在JSON字符串里要写成\\(和\\) - 匹配小数点
.的部分:原正则用[.],等价于\.,在JSON里要写成\\.(当然[.]本身在JSON里不需要转义,但用\.更符合正则书写习惯)
改写后的正则
把原正则转换成MongoDB JSON Schema可用的版本:
^rgba\\([0-9]+, [0-9]+, [0-9]+, (0(\\.[0-9]+)?|1(\\.0+)?)$
如果你习惯用\d代替[0-9],也可以写成:
^rgba\\(\\d+, \\d+, \\d+, (0(\\.\\d+)?|1(\\.0+)?)$
完整的MongoDB JSON Schema示例
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "textColor": { "type": "string", "pattern": "^rgba\\(\\d+, \\d+, \\d+, (0(\\.\\d+)?|1(\\.0+)?)$" } }, "required": ["textColor"] }
验证效果
这个正则可以正确匹配:
rgba(0, 0, 0, 1)rgba(255, 128, 0, 0.5)rgba(100, 100, 100, 1.0)
会拒绝不符合格式的字符串,比如:
rgba(0,0,0,1)(缺少数字后的空格)rgba(256, 0, 0, 1)(数值超出0-255,若需要可额外调整正则限制)rgba(0, 0, 0, 1.1)(alpha值大于1)
内容的提问来源于stack exchange,提问作者Bram Vanbilsen
相关产品推荐
相关产品推荐

