【问题标题】:MongoDB RegEx engine completenessMongoDB RegEx 引擎完整性
【发布时间】:2013-01-11 07:00:57
【问题描述】:

根据 Mongo 文档,它使用 PCRE 引擎,并且 PCRE 支持 \b 和 \w 用于 unicode 字符,但遵循 RegEx 与 Unicode 字符串不匹配,是否有任何解决方案或替代语法?

// in Mongo console:
 db.col.find({word:/\b\pL\b/});

// in PHP
(new Mongo())->db->col->find(['word'=>new MongoRegex('/\b\pL\b/u')]);

【问题讨论】:

  • 哪一个不匹配? PHP的?两个都?它应该匹配的字符串是什么?
  • @Thilo 两者,例如考虑这个字符串:“ی ش a”,其中包含三个匹配项。
  • 也许你可以告诉我们它在哪里说 MongoDB 支持 unicode,因为上面的页面:docs.mongodb.org/manual/reference/operator/regex/#_S_regex 没有提到这一点,而且 MongoDB 以 utf8 格式存储数据,所以除非它之后转换(它不会't) 那么它就行不通了。顺便说一下,PCRE 和 unicode PCRE 是两个不同的东西,PCRE 是 Perl 兼容的正则表达式,它仅表示正则表达式运算符在 MongoDB 中使用的表达式类型

标签: php regex mongodb unicode word-boundary


【解决方案1】:

我找不到任何关于 MongoDB 的 PCRE 实现支持哪些特性的文档,但如果它包含 \pL Unicode 字符类以及前瞻和后瞻断言,那么可以使用 Unicode 感知替换 @ 987654322@ 将是:

(?:(?=\pL)(?<!\pL)|(?!\pL)(?<=\pL))

基本上,(?=\pL)(?&lt;!\pL) 匹配如果下一个字符是字母而前一个不是,而(?!\pL)(?&lt;=\pL) 相反匹配如果前一个字符是字母但下一个不是。

当然,如果我们已经知道相邻字符可以是什么,那么这个正则表达式可以大大简化。例如,\b\pL+\b 的 Unicode 感知版本可以简单地写成:

(?<!\pL)\pL+(?!\pL)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多