想更改为每个单词的结尾而不是字符串的结尾(匹配) - MariaDB/MySQL + REGEXP_REPLACE
Posted
技术标签:
【中文标题】想更改为每个单词的结尾而不是字符串的结尾(匹配) - MariaDB/MySQL + REGEXP_REPLACE【英文标题】:Would like to change to each end of word instead of end of string (matching) - MariaDB/MySQL + REGEXP_REPLACE 【发布时间】:2020-01-28 11:41:15 【问题描述】:想要更改为每个单词的结尾而不是字符串的结尾(匹配)?
我现在有这个问题:
SELECT REGEXP_REPLACE(name,"(a|o|e|y|cy|dzy|rzy|owie|i|u|ów|owi|em)$",'') FROM `zp_poster`
查询示例:
SELECT REGEXP_REPLACE("Józefowi Piłsudski","(a|o|e|y|cy|dzy|rzy|owie|i|u|ów|owi|em)$",'')
预期结果:
Józef Piłsudsk
实际结果:
Józefowi Piłsudsk
【问题讨论】:
【参考方案1】:您可以使用单词边界字符类。
作为explained in the documentation,从版本 8.0.4 开始,mysql 正则表达式依赖于 ICU 表示法(Unicode 的国际组件),其中单词边界表示为 \b
。在早期版本中,使用了 Spencer 实现,边界表示为[[:<:]]
(单词前)和[[:>:]]
(单词后)。
SELECT REGEXP_REPLACE(
name,
'(a|o|e|y|cy|dzy|rzy|owie|i|u|ów|owi|em)\\b',
''
)
FROM `zp_poster`
Demo on DB Fiddle:
WITH t AS (
SELECT 'Józefowi Piłsudski' name
UNION ALL SELECT 'Piłsudski Józefowi'
)
SELECT
name,
REGEXP_REPLACE(
name,
'(a|o|e|y|cy|dzy|rzy|owie|i|u|ów|owi|em)\\b',
''
) replaced
FROM t;
| name | replaced |
| ------------------ | -------------- |
| Józefowi Piłsudski | Józef Piłsudsk |
| Piłsudski Józefowi | Piłsudsk Józef |
【讨论】:
以上是关于想更改为每个单词的结尾而不是字符串的结尾(匹配) - MariaDB/MySQL + REGEXP_REPLACE的主要内容,如果未能解决你的问题,请参考以下文章
.Net 正则表达式匹配 $ 与字符串的结尾而不是行的结尾,即使启用了多行