Seperti yang dikatakan Avinash Raj dalam komentar, tanda hubung dalam pola ekspresi reguler Anda ditafsirkan sebagai rentang. Perilaku tampaknya bergantung pada algoritme pengurutan yang digunakan oleh dua klien, berdasarkan variabel lingkungan NLS_LANG, yang memengaruhi nilai NLS_SORT.
Dengan NLS_LANG=ENGLISH_UNITED KINGDOM.WE8ISO8859P1
:
SQL> select REGEXP_REPLACE ('TEST 3304 V2', '[`[email protected]#$%^&*()_+-={}|;.:<>?,./]', ' ') as REG from dual;
REG
------------
TEST V
SQL> select value from nls_session_parameters where parameter = 'NLS_SORT';
VALUE
----------
BINARY
Mengambil risiko karena profil Anda mengatakan bahwa Anda berada di Maroko, dengan NLS_LANG="ARABIC_MOROCCO.AR8MSWIN1256"
:
SQL> select REGEXP_REPLACE ('TEST 3304 V2', '[`[email protected]#$%^&*()_+-={}|;.:<>?,./]', ' ') as REG from dual;
REG
------------
TEST 3304 V2
SQL> select value from nls_session_parameters where parameter = 'NLS_SORT';
VALUE
----------
ARABIC
Alasannya adalah bahwa segmen pola +-=
diperlakukan sebagai rentang yang mencakup semua karakter dari +
ke =
. Dalam ISO8859-1 dan kumpulan karakter Windows 1252
yaitu karakter 43 hingga 61, dan semua digit numerik termasuk dalam kisaran itu - nol adalah 48 misalnya - berada dalam kisaran itu, jadi regex menggantikannya. Itu juga berlaku di kumpulan karakter Windows 1256
. (Dan apa pun berdasarkan ASCII).
Tetapi NLS_LANG Anda juga secara implisit mengubah urutan pengurutan, dan beralih dari pengurutan BINARY ke ARABIC yang mengubah perilaku. Anda dapat melihatnya dalam satu sesi; dengan NLS_LANG=ENGLISH_UNITED KINGDOM.WE8ISO8859P1
:
SQL> select REGEXP_REPLACE ('TEST 3304 V2', '[`[email protected]#$%^&*()_+-={}|;.:<>?,./]', ' ') as REG from dual;
REG
------------
TEST V
SQL> alter session set NLS_SORT=ARABIC;
Session altered.
SQL> select REGEXP_REPLACE ('TEST 3304 V2', '[`[email protected]#$%^&*()_+-={}|;.:<>?,./]', ' ') as REG from dual;
REG
------------
TEST 3304 V2
Anda juga dapat mengetahui bahwa ini adalah masalah rentang dengan sedikit memodifikasi rentang; mengubah +-=
ke +-3
jadi angka yang lebih tinggi tidak disertakan, tetapi yang lainnya tetap sama:
SQL> alter session set NLS_SORT=BINARY;
Session altered.
SQL> select REGEXP_REPLACE ('TEST 3304 V2', '[`[email protected]#$%^&*()_+-3{}|;.:<>?,./]', ' ') as REG from dual;
REG
------------
TEST 4 V
Baca selengkapnya tentang pengurutan linguistik .
Mengandalkan pengaturan NLS selalu berisiko, jadi lebih baik untuk menghindari masalah rentang sepenuhnya dengan mengubah pola untuk memiliki tanda hubung di awal atau akhir, yang menghentikannya dilihat sebagai rentang sama sekali; lagi seperti yang disarankan Avinash Raj.