想更改为单词的每个结尾而不是字符串的结尾(匹配)- MariaDB/MySQL + REGEXP_REPLACE

Would like to change to each end of word instead of end of string (matching) - MariaDB/MySQL + REGEXP_REPLACE

想要更改为单词的每个结尾而不是字符串的结尾(匹配)?

我现在有这个查询:

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)$",'')

Expected result:

Józef Piłsudsk

Real result:

Józefowi Piłsudsk

您可以使用字边界字符class。

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 |