使用mongolite在R中操作MongoDB时正则元字符转义的疑问
为什么mongolite查询中需要四个反斜杠来转义正则里的点?
这本质是三层转义的叠加,一步步拆解就清楚了:
MongoDB正则的需求:
你要匹配字面量的.(78.20里的点是普通字符,不是正则的通配符),所以正则里必须写成\.——这是第一层,正则语法要求的转义。JSON格式的转义要求:
mongolite是把查询语句以JSON字符串的形式传给MongoDB的。而JSON语法规定,字符串里的反斜杠必须被转义(反斜杠是JSON的转义字符)。所以要在JSON里表示一个\,必须写成\\。那正则里的\.到了JSON里就变成了\\.——这是第二层,JSON的转义。R字符串的转义规则:
现在你要在R里写这个JSON字符串。R的字符串中,反斜杠同样是转义字符(比如用来表示换行\n)。所以要在R的字符串里表示一个\,必须写成\\。那JSON里的\\.到了R的字符串里,就需要写成\\\\.——这是第三层,R字符串的转义。
最终的流转逻辑:
- R代码里的:
'{"index.tgh": {"$regex": "^78\\.20.*"}}' - R解析后传给mongolite的字符串是:
{"index.tgh": {"$regex": "^78\\.20.*"}}(这里的两个反斜杠是JSON需要的) - mongolite把这个JSON传给MongoDB,MongoDB解析后得到正则:
^78\.20.*,完美匹配以78.20开头的内容。
如果只用两个反斜杠,R解析后会变成^78\.20.*,传到MongoDB的JSON里就成了^78.20.*——这里的.是正则通配符,会匹配任意字符,而不是字面量的点,自然达不到你要的效果。
内容的提问来源于stack exchange,提问作者SabDeM
相关产品推荐
相关产品推荐

