2016-11-15 72 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

这应该适用于其他语言,但要根据具体情况进行。 –