2016-11-15 1 views

ответ

0

REGEXP MySQL работает только с байт. Русские символы имеют 2 байта.

Для ограничивающего на кириллице, это кажется правильным:

SELECT HEX('Привет') REGEXP '^((D0|D1)..)+$'; -- > 1 

(я вернусь к этому вопросу избежать ведущих гласные в минуту.)

Для объяснения:

  • Все русские символы имеют 2 байта, первый байт является шестнадцатеричным D0 или D1. (На этом могут быть нерусские персонажи, я игнорирую эту проблему.)
  • (...|...) - | означает «ИЛИ».
  • .. соответствует двухбайтовому шестнадцатеричному выражению, говорящему, что второй байт может быть любым (это слишком много, но может не повредить).
  • (...)+ - Плюс означает одно или более случаев.
  • ^ и $ «привязать» регулярное выражение, чтобы охватить всю строку.

Назад к списку no-leading-vowel вопрос. Теперь нам нужно сыграть в несколько болезненных игр, чтобы перечислить гласные; их HEX кажутся

D0, followed by any of B0 B5 B8 BE 
         90 95 98 9E, or 
D1, followed by any of 83 8B 8D 8E 8F 
         A3 AB AD AE AF 

Пример: select hex('э'); ->D18D.

Объединить все это будет грязно, потому что у MySQL нет инструментов (?, чтобы сказать «нет». Итак, я начну испытывать для ведущих гласной:

SELECT HEX('Привет') 
REGEXP '^(D0(B0|B5|B8|BE|90|95|98|9E))|(D1(83|8B|8D|8E|8F|A3|AB|AD|AE|AF))' 

правильно выходит из строя.

Теперь, чтобы положить вещи вместе:

SELECT NOT HEX('Привет') 
REGEXP '^(D0(B0|B5|B8|BE|90|95|98|9E))|(D1(83|8B|8D|8E|8F|A3|AB|AD|AE|AF))' 
AND  HEX('Привет') 
REGEXP '^((D0|D1)..)+$'; 

Первая проверка часть для NOT ведущей гласной; вторая часть проверяет, чтобы все символы были русскими.

Этот тестовый пример работает, и 'э' вернулся с 0, но я, возможно, где-то сходил.

(Это был вызов.)

+0

Это должно быть адаптировано к другим языкам, но в каждом конкретном случае. –

Смежные вопросы