如何使用RegEx查询Cosmos DB记录?匹配10位数字报错解决
在Azure Cosmos DB NoSQL查询中匹配10位数字的正则问题解决
问题描述
容器内的文档示例:
{ "id": "abc", "stockNumber": "1001234567" } { "id": "pqr", "stockNumber": "200" } { "id": "xyz", "stockNumber": "200111" }
尝试用正则匹配恰好10位数字的stockNumber字段,执行以下查询时:
SELECT * FROM c WHERE RegexMatch(c.stockNumber, @"\b\d{10}\b")
返回错误:
{ "code": "BadRequest", "message": "One of the input values is invalid." }
期望结果:
{ "id": "abc", "stockNumber": "1001234567" }
问题原因
Cosmos DB的RegexMatch函数基于.NET正则引擎,但在Cosmos查询字符串中,反斜杠需要双重转义,原查询的写法不符合语法要求,导致解析失败。另外,对于纯数字的字段,用^(字符串起始)和$(字符串结束)限定匹配范围,比单词边界\b更精准。
解决方案
方案1:首尾锚点精准匹配
使用^和$限定整个字符串为10位数字,同时对反斜杠双重转义:
SELECT * FROM c WHERE RegexMatch(c.stockNumber, "^\\d{10}$")
方案2:转义单词边界反斜杠
若要保留\b写法,需将所有反斜杠双重转义:
SELECT * FROM c WHERE RegexMatch(c.stockNumber, "\\b\\d{10}\\b")
参考说明
根据Azure Cosmos DB官方文档:RegexMatch函数用于验证字符串是否匹配指定正则表达式,依赖.NET正则引擎。在Cosmos查询的字符串字面量中,所有反斜杠必须双重转义,否则会被识别为普通转义字符,而非正则表达式的组成部分。
内容的提问来源于stack exchange,提问作者GThree
相关产品推荐
相关产品推荐

