SELECT 'Hello' REGEXP '^[^aeiouAEIOU][A-Za-z]*$' -> 1
SELECT 'Привет' REGEXP '^[^аеиоуыэюяАЕИОУЫЭЮЯ][А-Яа-я]*$' -> 0
- 它必须返回 1。
最佳答案
MySQL 的 REGEXP 仅适用于字节。俄语字符每个 2 个字节。
对于限制为西里尔字母,这似乎是正确的:
SELECT HEX('Привет') REGEXP '^((D0|D1)..)+$'; -- > 1
(我很快就会讨论避免前元音的问题。)
解释一下:
- 所有俄语字符均为 2 个字节,第一个字节为十六进制
D0
或D1
。 (可能有非俄语字符以这种方式开始;我忽略了这个问题。) (...|...)
-|
表示“或”。..
匹配 2 字节的十六进制,表示第二个字节可以是任何内容(这有点过头了,但可能不会造成伤害)。(...)+
- 加号表示出现一次或多次。^
和$
“锚定”正则表达式以包含整个字符串。
回到无主元音问题。现在我们需要玩一些痛苦的游戏来列出元音;他们的十六进制似乎是
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
,但我可能在某个地方犯了错误。
(这是一个挑战。)
关于MySQL REGEXP 无法与俄语字符正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40616947/