我在mongo查询中使用此$regex
模式:
{domain: {$regex: '^(.+\.)?youtube.com$'}}
期望它与youtube.com
和sub.youtube.com
匹配。
我看到的问题是它匹配justyoutube.com
之类的内容。
在JavaScript中,它不匹配:
console.log(/^(.+\.)?youtube.com$/.test('justyoutube.com'));
// this returns `false` as expected.

有没有更好的方法让这个工作?我的正则表达式或MongoDB使用的正则表达式库存在问题吗?
更新:看起来当我使用/pattern/
与'pattern'
时,我得到了我期待的结果。仍然很好奇如何使用引号来获取它,因为我可以在MongoDB Compass中更轻松地进行调试。
答案 0 :(得分:3)
我猜测你传递的字符串中的\
在字符串本身中充当转义字符,并且不会使它成为实际的正则表达式。您可以尝试将反斜杠加倍,以“逃避逃脱”:
const unescaped = new RegExp('^(.+\.)?youtube.com$')
const escaped = new RegExp('^(.+\\.)?youtube.com$')
console.log(unescaped.test('justyoutube.com'));
console.log(escaped.test('justyoutube.com'));
console.log(unescaped.test('sub.youtube.com'));
console.log(escaped.test('sub.youtube.com'));
// Or you can use a template literal, which interprents all its characters literally:
const withBacktick = new RegExp(`^(.+\.)?youtube.com$`);
console.log(withBacktick.test('sub.youtube.com'));
console.log(withBacktick.test('justyoutube.com'));