想更改为每个单词的结尾而不是字符串的结尾(匹配) - 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 正则表达式匹配 $ 与字符串的结尾而不是行的结尾,即使启用了多行

如何使用正则表达式匹配不以某些字符开头或结尾的单词?

正则表达式:如何匹配以括号“)”结尾的单词

Python爬虫编程思想(33):匹配字符串的起始和结尾以及单词边界

如何在NSString中每个单词的开头和结尾添加一个字符

42 python中正则中的分组 正则中匹配字符串的起始和结尾以及单词边界