cqwcns 发表于 2021-10-23 13:36

关于正则表达式,各位帮忙评评理。

本帖最后由 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?
各位大佬有什么建议?谢谢交流。

cqwcns 发表于 2021-10-23 13:37

补充官方文档:
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

qiduo 发表于 2021-10-23 14:50

不用评理,写完了 自己测测不就是了。

kiseyzed 发表于 2021-10-23 14:54

至少给个匹配数据啊,万能匹配(.*?)

cqwcns 发表于 2021-10-23 15:26

真是孤陋寡闻了{:1_889:}

原来加两个转义符可以。
例如要查询的关键字是:'茂名茂南区华侨新村宿舍I4二级('
这样不行:'茂名茂南区华侨新村宿舍I4二级\('
要这样:'茂名茂南区华侨新村宿舍I4二级\\('

    .match({
      equipmentName: db.RegExp({
      regexp: '茂名茂南区华侨新村宿舍I4二级\\(',
      options: 'i',
      })
    })

真是峰回路转,不明白为什么是两个转义符,而不是一个。

一片小朵朵 发表于 2021-10-23 16:00

cqwcns 发表于 2021-10-23 15:26
真是孤陋寡闻了

原来加两个转义符可以。


因为是在字符串里面,‘\’本身需要转义一次

fisher 发表于 2021-10-23 16:10

js里面要用变量存正则,应该用这种形式.

var t = /sttttt/

吾爱丶WQX 发表于 2021-10-23 16:18

直接看文档啊

涛之雨 发表于 2021-10-23 16:22

本帖最后由 涛之雨 于 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, "\\\*");

冥界3大法王 发表于 2021-10-23 16:28

编正则用正宗的工具:RegexBuddy
边测试边修改,都匹配对了,就合理了。
页: [1] 2
查看完整版本: 关于正则表达式,各位帮忙评评理。