Комментарии 6
Отличные грабли!
Очень похоже на то, что движок регулярок в Oracle сделан не совсем… правильно, что ли.
Очень похоже на то, что движок регулярок в Oracle сделан не совсем… правильно, что ли.
Я бы сказал — не совершенен. Еще в 11-й версии буква Ё жила отдельной жизнью, не попадая в диапазон, надо было явно в шаблоне прописывать, а тут был приятно удивлен. Механизма «Просмотр вперёд и назад» нет. Но в целом все равно выручают.
Там же в документации(прямо по своей же приведенной ссылке гляньте) указано специально про NLS_SORT:
Note: In the POSIX standard, a range includes all collation elements between the start and end of the range in the linguistic definition of the current locale. Thus, ranges are linguistic rather than byte value ranges; the semantics of the range expression are independent of the character set. In Oracle Database, the linguistic range is determined by the NLS_SORT initialization parameter.
Ну да, читал, оттуда грабли и растут :-)
Может я чего не понимаю, но зачем надо было привязывать диапазон регулярок по умолчанию к NLS_SORT?
Наверное, чтоб разрабы себе бошки поразбивали, прежде чем поймут, что вся соль в этом маленьком кусочке документации. Это же так анти-интуитивно.
Может я чего не понимаю, но зачем надо было привязывать диапазон регулярок по умолчанию к NLS_SORT?
Наверное, чтоб разрабы себе бошки поразбивали, прежде чем поймут, что вся соль в этом маленьком кусочке документации. Это же так анти-интуитивно.
А вобще, xtender, глянь на деваху лучше, как тебе ее шапочка? Ты как ACS должен был это заценить. в первую очередь :-)
Из этого абзаца следует, что при NLS_SORT=RUSSIAN буква ё таки должна попадать в диапазон [а-я]. Но вот что любопытно: при явно указанном case-sensitive снова попадать перестает.
Connected to Oracle Database 12c Enterprise Edition Release 12.1.0.2.0
SQL> alter session set NLS_SORT=RUSSIAN;
Session altered
SQL> alter session set NLS_COMP=LINGUISTIC;
Session altered
SQL> with ABC as (
2 select column_value as symbol
3 from table(sys.odcivarchar2list('А','Е','Ё','Я','а','е','ё','я'))
4 )
5 select symbol,
6 nlssort(symbol) nls_code_hex
7 from ABC
8 order by symbol;
SYMBOL NLS_CODE_HEX
------ -------------------
А 8C000100
а 8C000200
Е 9A000100
е 9A000200
Ё 9C000100
ё 9C000200
Я E6000100
я E6000200
8 rows selected
SQL> select * from dual where regexp_like('ё', '[а-я]');
DUMMY
-----
X
SQL> select * from dual where regexp_like('ё', '[а-я]', 'i');
DUMMY
-----
X
SQL> select * from dual where regexp_like('ё', '[а-я]', 'c');
DUMMY
-----
SQL>
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Регулярные выражения Oracle. Опасный диапазон