gpt4 book ai didi

mysql - mysql中正则表达式的求值顺序

转载 作者:行者123 更新时间:2023-11-29 18:17:19 25 4
gpt4 key购买 nike

我试图根据mysql数据库中男姓的正则表达式找到女姓。我快完成了,但我的正则表达式中仍然存在一个错误,我不知道它是什么。括号[]中的可选字符很多是因为数据库非常困惑造成的。我已经尝试过在线调试器,但没有成功。

来源:

从字符串转换:

Řezníček

我的查询:

SELECT * FROM `female`
WHERE (sex= 'žena')
AND (surname REGEXP
'^[rř].{0,1}[eéě][zž].{0,1}[nň][aeiouáéíóúěyý]*[cč][aeiouáéíóúěyý]*[k].*$')

所需输出:

Řezníčková
Řezníčková
Řezníčková
Řezníčková

当前输出:

Řezníčková
Řezníková
Řezníková
Řezníčková

正则表达式解释:(不知何故,在 mysql 正则表达式中的行为与其他系统中常见的行为不同,所以我必须完善我的解决方案):

^[rř].{0,1}[eéě]

r o ř 应该位于句子的开头

第二个位置应该是元音 e 或 é 或 ě

。{0,1}没有它,它就无法按预期工作

<小时/>
[zž].{0,1}[nň]

两个非元音之间始终为 .{0,1},否则表达式不起作用

<小时/>
[nň][aeiouáéíóúěyý]*

如果非元音后面是元音,则这些规则之间不需要另一个 *

<小时/>
[aeiouáéíóúěyý]*

如果元音不是姓氏中的第一个,那么它始终是可选的

<小时/>
[cč]
[k]

任何其他非元音都是强制性的

<小时/>
.*$

因为我们正在从男性中搜索女性姓氏,所以我们预计女性姓氏更长并且以某种方式基于男性姓氏。女性姓氏末尾附加 3-5 个字符。

问题:

当表达式中的 c 或 č 是必需的时,为什么输出中会出现姓氏“Řezníková”?有没有办法强制 regexp 按原样评估表达式而不应用优先级?我怀疑 [cč] 在某种程度上被 * 抑制了。

非常感谢你们提出的建议。

最佳答案

MySQL 的正则表达式不理解多字节字符(č 等)。 [cč] 不检查 c(十六进制 63)或 č(十六进制 C48D) 检查以下 3 个字节中的任何一个:63 C4 8D。由于 C4 是公共(public)的第一个字节,因此它确实匹配。

MariaDB 的正则表达式可以。因此,切换到这一点就是一个答案。

使用HEX(surname) REGEXP ...可能是MySQL的替代方案,但正则表达式会相当困惑。例如,要构建十六进制版本,您需要 (63|C48D),其中 [cč] 当前所在位置。

转换为LIKE可能是一种替代方案。请注意,大多数排序规则中 e = é = ě,因此无需提及 e 以外的任何内容。 (再想一想,LIKE 似乎不太可能,因为它没有任何东西可以像 [aeiouáéíóúěyý] 那样模拟“字符类”。)

请提供显示创建表

十六进制正则表达式类似于

^(72|C599)(..)?(65|C3A9|C49B)(7A|C5BE)(..)? (等等)但我想这也行不通,因为 (..)? 表示 0 或 1 个单字节(2 十六进制),但您需要 0 或 1 个字符。所以需要用 ([4-7].|C...) 替换?。等等等等

关于mysql - mysql中正则表达式的求值顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46908637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com