MySQL REGEXP 无法与俄语字符正常工作

标签 mysql regex

SELECT 'Hello' REGEXP '^[^aeiouAEIOU][A-Za-z]*$' -> 1

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

最佳答案

MySQL 的 REGEXP 仅适用于字节俄语字符每个 2 个字节。

对于限制为西里尔字母,这似乎是正确的:

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

(我很快就会讨论避免前元音的问题。)

解释一下:

  • 所有俄语字符均为 2 个字节,第一个字节为十六进制 D0D1。 (可能有非俄语字符以这种方式开始;我忽略了这个问题。)
  • (...|...) - | 表示“或”。
  • .. 匹配 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/

相关文章:

mysql - 如何将mysql合并到一个sql查询中

mysql - 如何在 Apache::DBI 中禁用 ping?

re.sub 上的 Python 正则表达式额外字符(正则表达式替换)

javascript - 我想删除除 "."之外的所有非数字和所有标点符号

mysql - 在 MySQL 中使用联接从多个表中选择数据

php - 无法从多个复选框分配 POST 数据

ruby - 这两个正则表达式捕获页面上的内部链接有什么区别?

java - java中的正则表达式匹配以html开头后跟某些内容的字符串

mysql - JPA 中的日期默认初始化

c# - 正则表达式,当有两种模式时找到匹配项,C#