$ regex匹配模式在MongoDB与Javascript中有不同的结果

时间:2018-01-04 02:54:52

标签: javascript regex mongodb

我在mongo查询中使用此$regex模式:

{domain: {$regex: '^(.+\.)?youtube.com$'}}

期望它与youtube.comsub.youtube.com匹配。

我看到的问题是它匹配justyoutube.com之类的内容。

在JavaScript中,它不匹配:



console.log(/^(.+\.)?youtube.com$/.test('justyoutube.com'));
// this returns `false` as expected.




有没有更好的方法让这个工作?我的正则表达式或MongoDB使用的正则表达式库存在问题吗?

更新:看起来当我使用/pattern/'pattern'时,我得到了我期待的结果。仍然很好奇如何使用引号来获取它,因为我可以在MongoDB Compass中更轻松地进行调试。

1 个答案:

答案 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'));