2016-11-15 69 views
0

SELECT 'Hello' REGEXP '^[^aeiouAEIOU][A-Za-z]*$' -> 1MySQL的REGEXP不與俄羅斯字符

SELECT 'Привет' REGEXP '^[^аеиоуыэюяАЕИОУЫЭЮЯ][А-Яа-я]*$' -> 0正常工作 - 它必須返回1.

+0

聽起來更像是一個Oracle問題而不是問題。 –

回答

0

MySQL的REGEXP只字節工作。俄文字符每個是2個字節。

對於限制西里爾,這似乎是正確的:

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

(我會避免在一分鐘內領先的元音的問題。)

解釋道:

  • 所有的俄文字符都是2個字節,第一個字節是十六進制的D0D1。 (可能會有非俄羅斯字符開始這種方式;我忽略了這個問題。)
  • (...|...) - |意思是'或'。
  • ..匹配一個2字節的十六進制,表示第二個字節可以是任何東西(這是過度殺傷,但可能不會傷害)。
  • (...)+ - 加號表示一次或多次出現。
  • ^$「錨定」正則表達式以包含整個字符串。

回到沒有領先的元音問題。現在我們需要玩一些痛苦的遊戲來列出元音;其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

這應該適用於其他語言,但要根據具體情況進行。 –