关于正则表达式,各位帮忙评评理。
本帖最后由 cqwcns 于 2021-10-23 13:42 编辑事情是这样的,微信小程序,云开发数据库,需求是关键字模糊查询。
官方文档在这:
Database.RegExp
https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/database/Database.RegExp.html
Aggregate.match(object: Object): Aggregate
https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/database/aggregate/Aggregate.match.html
由于需要查询的字段内容包含正则的特殊字符,如括号()、中横线-等。
一开始我这样查,根本查询不到内容:
return await db.collection(event.collection).aggregate()
.match({
equipmentName: new db.RegExp({
regexp: '茂名茂南区华侨新村宿舍I4二级(扩)',
options: 'i',
})
})
.group({
_id: {
_id: '$_id',
department1: '$equipmentName',
department2: '$boxName'
}
})
.end();
后来我想到应该是我未转义特殊字符,于是我这样查,但仍然是查不到内容:
return await db.collection(event.collection).aggregate()
.match({
equipmentName: new db.RegExp({
regexp: '茂名茂南区华侨新村宿舍I4二级\(扩\)',
options: 'i',
})
})
.group({
_id: {
_id: '$_id',
department1: '$equipmentName',
department2: '$boxName'
}
})
.end();
进一步尝试,我这样查,但仍然是查不到内容:
let thisReg = new RegExp('茂名茂南区华侨新村宿舍I4二级', 'i');
return await db.collection(event.collection).aggregate()
.match({
equipmentName: thisReg
})
.group({
_id: {
_id: '$_id',
department1: '$equipmentName',
department2: '$boxName'
}
})
.end();
后来我尝试这样,竟然能查询到内容:
return await db.collection(event.collection).aggregate()
.match({
equipmentName: /茂名茂南区华侨新村宿舍I4二级\(扩\)/i
})
.group({
_id: {
_id: '$_id',
department1: '$equipmentName',
department2: '$boxName'
}
})
.end();
虽然最后一种办法能实现功能,但当需要将一个变量作为关键字时,就不方便了,据我了解通过/.../的字面量形式创建的正则,无法直接引用变量作为关键字(斜杠中间的内容一律作为字符串)。
所以如果要引用变量,还要这样:
str='/小明可能是单身狗/i';
eval(str);
所以,大家认为这个,到底是我的代码有问题?还是腾讯云开发RegExp构建有BUG?
各位大佬有什么建议?谢谢交流。
补充官方文档:
Database.RegExp
https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/database/Database.RegExp.html
Aggregate.match(object: Object): Aggregate
https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/database/aggregate/Aggregate.match.html 不用评理,写完了 自己测测不就是了。 至少给个匹配数据啊,万能匹配(.*?)
真是孤陋寡闻了{:1_889:}
原来加两个转义符可以。
例如要查询的关键字是:'茂名茂南区华侨新村宿舍I4二级('
这样不行:'茂名茂南区华侨新村宿舍I4二级\('
要这样:'茂名茂南区华侨新村宿舍I4二级\\('
.match({
equipmentName: db.RegExp({
regexp: '茂名茂南区华侨新村宿舍I4二级\\(',
options: 'i',
})
})
真是峰回路转,不明白为什么是两个转义符,而不是一个。
cqwcns 发表于 2021-10-23 15:26
真是孤陋寡闻了
原来加两个转义符可以。
因为是在字符串里面,‘\’本身需要转义一次 js里面要用变量存正则,应该用这种形式.
var t = /sttttt/ 直接看文档啊 本帖最后由 涛之雨 于 2021-10-23 16:26 编辑
基础的正则表达式。。。
正则表达式直接用/括起来可以
或者把所有的特殊字符都使用\转义再用引号引起来(\属于特殊字符)
(下面的代码是从我之前某个文件里复制出来的,不一定完全适用当前的问题,反正大概就是这个意思)
//变量转正则表达式(某些关键词加转义符)
var varToRegEx = a = >a.replace(/\?/g, "\\\?").replace(/\//g, "\\\/").replace(/\(/g, "\\\(").replace(/\[/g, "\\\[").replace(/\{/g, "\\\{").replace(/\$/g, "\\\$").replace(/\./g, "\\\.").replace(/\+/g, "\\\+").replace(/\*/g, "\\\*");
编正则用正宗的工具:RegexBuddy
边测试边修改,都匹配对了,就合理了。
页:
[1]
2