Mongoのドキュメントによると、PCREエンジンを使用しており、PCREはUnicode文字に対して\bと\wをサポートしていますが、正規表現に従うと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')]);
Mongoのドキュメントによると、PCREエンジンを使用しており、PCREはUnicode文字に対して\bと\wをサポートしていますが、正規表現に従うと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')]);
MongoDBのPCRE実装がサポートする機能に関する正確なドキュメントは見つかりませんでしたが、\pL
Unicode文字クラスと先読みおよび後読みアサーションが含まれている場合、Unicode対応の代替は次の\b
ようになります。
(?:(?=\pL)(?<!\pL)|(?!\pL)(?<=\pL))
基本的に(?=\pL)(?<!\pL)
、次の文字が文字で前の文字が文字でない(?!\pL)(?<=\pL)
場合に一致しますが、逆に、前の文字が文字であるが次の文字が文字でない場合に一致します。
もちろん、隣接する文字が何であるかについてすでに何かを知っている場合、この正規表現は大幅に簡略化できます。たとえば、Unicode対応バージョンのは次の\b\pL+\b
ように簡単に記述できます。
(?<!\pL)\pL+(?!\pL)