吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1402|回复: 19
收起左侧

[讨论] 关于正则表达式,各位帮忙评评理。

[复制链接]
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


由于需要查询的字段内容包含正则的特殊字符,如括号()、中横线-等。

一开始我这样查,根本查询不到内容:
[JavaScript] 纯文本查看 复制代码
  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();


后来我想到应该是我未转义特殊字符,于是我这样查,但仍然是查不到内容:

[JavaScript] 纯文本查看 复制代码
  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();


进一步尝试,这样查,但仍然是查不到内容:


[JavaScript] 纯文本查看 复制代码
  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();


后来我尝试这样,竟然能查询到内容:


[Asm] 纯文本查看 复制代码
  return await db.collection(event.collection).aggregate()
    .match({
      equipmentName: /茂名茂南区华侨新村宿舍I4二级\(扩\)/i
    })
    .group({
      _id: {
        _id: '$_id',
        department1: '$equipmentName',
        department2: '$boxName'
      }
    })
    .end();



虽然最后一种办法能实现功能,但当需要将一个变量作为关键字时,就不方便了,据我了解通过/.../的字面量形式创建的正则,无法直接引用变量作为关键字(斜杠中间的内容一律作为字符串)。
所以如果要引用变量,还要这样:
[JavaScript] 纯文本查看 复制代码
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
真是孤陋寡闻了

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

[JavaScript] 纯文本查看 复制代码
    .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 编辑

基础的正则表达式。。。
正则表达式直接用/括起来可以
或者把所有的特殊字符都使用\转义再用引号引起来(\属于特殊字符)
(下面的代码是从我之前某个文件里复制出来的,不一定完全适用当前的问题,反正大概就是这个意思)

[JavaScript] 纯文本查看 复制代码
//变量转正则表达式(某些关键词加转义符)
var varToRegEx = a = >a.replace(/\?/g, "\\\?").replace(/\//g, "\\\/").replace(/\(/g, "\\\(").replace(/\[/g, "\\\[").replace(/\{/g, "\\\{").replace(/\$/g, "\\\$").replace(/\./g, "\\\.").replace(/\+/g, "\\\+").replace(/\*/g, "\\\*");

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
cqwcns + 1 + 1 谢谢@Thanks!

查看全部评分

冥界3大法王 发表于 2021-10-23 16:28
编正则用正宗的工具:RegexBuddy
边测试边修改,都匹配对了,就合理了。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-19 03:12

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表