MYSQL:寻找相当于Perl的“regex”= ~s / e / i / g => MySQL Select中的rigix

时间:2009-08-23 08:30:59

标签: mysql regex replace

我可以在MYSQL选择中匹配和替换文本模式吗?


修改 现在它的答案似乎是:无法完成, 因为你无法捕捉匹配的内容(来自Eric的回答/评论)。现在我将考虑添加一个查找表。


简化示例:

MySQL表Coleridge拥有许多字符串,如:

text
------------------------------------
In_Xanadu_did_Kubla_Khan
A_stately_pleasure_dome_decree
Where_Alph_the_sacred_river_ran
Through_caverns_measureless_to_man
Down_to_a_sunless_sea

有没有办法表达选择

SELECT text = ~s / [^ _] + _(。*)_ [^ _] + $ / \ 1 / 替换为来自Coleridge

并获取

replaced
________________________
Xanadu_did_Kubla
stately_pleasure_dome
Alph_the_sacred_river
caverns_measureless_to
to_a_s

请注意:

  1. 正则表达式s / / / I. 提供的要简单得多 比现实世界数据库包含的内容
  2. 不幸的是我无法正常化 DB ..

2 个答案:

答案 0 :(得分:5)

没有正则表达式来替换MySQL中的任何东西。您可以在基于RegEx(regexp)的MySQL中进行匹配,但这不会返回匹配的部分,只返回整个列。但是,你可以这样使用replace

select replace(col, 'e', 'i') from tbl

这会将regex作为rigix返回。

至于您的具体示例,您必须使用locatesubstring的组合:

select 
    substring(col
        , locate('_', col)+1
        , locate('_', reverse(col))-(len(col)-locate('_', col)-1)) 
from tbl

关于数据库级别的字符串操作/处理的一般规则是:保持简单。 RDBMS是集合思考,而这就是它们闪耀的地方。拉动单个弦乐操作并不是他们的最佳选择。因此,没有任何RDBMS具有真正成熟的字符串处理功能(并且在不同的处理函数之间肯定没有任何一致性)。如果你的正则表达式相当复杂,你很可能只想在表示/应用层上处理它,而不是在数据库中处理它。

答案 1 :(得分:2)

不,你不能。 MySQL仅支持匹配(RLIKE)的正则表达式,而不是替换。