SELECT 'Hello' REGEXP '^[^aeiouAEIOU][A-Za-z]*$' -> 1
MySQL的REGEXP不与俄罗斯字符
SELECT 'Привет' REGEXP '^[^аеиоуыэюяАЕИОУЫЭЮЯ][А-Яа-я]*$' -> 0
正常工作 - 它必须返回1.
SELECT 'Hello' REGEXP '^[^aeiouAEIOU][A-Za-z]*$' -> 1
MySQL的REGEXP不与俄罗斯字符
SELECT 'Привет' REGEXP '^[^аеиоуыэюяАЕИОУЫЭЮЯ][А-Яа-я]*$' -> 0
正常工作 - 它必须返回1.
MySQL的REGEXP只字节工作。俄文字符每个是2个字节。
对于限制西里尔,这似乎是正确的:
SELECT HEX('Привет') REGEXP '^((D0|D1)..)+$'; -- > 1
(我会避免在一分钟内领先的元音的问题。)
解释道:
D0
或D1
。 (可能会有非俄罗斯字符开始这种方式;我忽略了这个问题。)(...|...)
- |
意思是'或'。..
匹配一个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
,但我可能在某处愚弄。
(这是一个挑战)
这应该适用于其他语言,但要根据具体情况进行。 –
听起来更像是一个Oracle问题而不是问题。 –