Mon go RegEx - Соответствует всем типам пробелов - PullRequest
2 голосов
/ 16 января 2020

\s Подстановочный знак regex не соответствует всем типам пробелов в mongodb (v4.0.3)

> db.test.insertOne({ "mail" : "special email@example.com" })
> db.test.insertOne({ "mail" : "normal email@example.com" })

> db.test.find({ mail: / / }, { _id: 0, mail: 1 })
{ "mail" : "special email@example.com" }
> db.test.find({ mail: /\s/ }, { _id: 0, mail: 1 })
{ "mail" : "normal email@example.com" }

Пробел в special email@example.com выше - это специальный пробел, а нормальный пробел в normal email@example.com

Это ожидаемое или ошибка? Есть ли способ сделать так, чтобы он совпадал со всеми пробелами?

Sidenote: я использую регулярное выражение внутри $not, поэтому я не могу использовать $regex


Редактировать : Четный [^\S] не соответствует обеим строкам

> db.test.find({ mail: /[^\S]/ }, { _id: 0, mail: 1 })
{ "mail" : "normal email@example.com" }

Может ли регулярное выражение mon go работать только с ASCII?

1 Ответ

4 голосов
/ 16 января 2020

Пн go использует PCRE-аромат https://docs.mongodb.com/manual/reference/operator/query/regex/#op ._ S_regex

https://www.pcre.org/original/doc/html/pcrepattern.html читает:

По умолчанию \ Теперь символы s - это HT (9), LF (10), VT (11), FF (12), CR (13) и пробел (32), которые определены как пробел в локали "C". Этот список может отличаться, если выполняется сопоставление с указанием локали c. Например, в некоторых локалях символ «неразрывный пробел» (\ xA0) распознается как пробел, а в других символ VT отсутствует.

Вы можете заменить \s на

[\s\x00a0\x1680\x2000\x2001\x2002\x2003\x2004\x2005\x2006
\x2007\x2008\x2009\x200a\x2028\x2029\x202f\x205f\x3000\xfeff]

(разделение для удобства чтения) для совместимости со вкусом регулярных выражений ECMA.

Возможно, вам потребуется заключить коды в {} в зависимости от оболочки / клиента, например, \x{00a0}\x{1680} и так далее.

По вашему запросу это будет:

db.test.find({ mail: /[\s\x{00a0}\x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005}\x{2006}\x{2007}\x{2008}\x{2009}\x{200a}\x{2028}\x{2029}\x{202f}\x{205f}\x{3000}\x{feff}]/ }, { _id: 0, mail: 1 })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...