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

lex*_*exu 5 regex mysql 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
Run Code Online (Sandbox Code Playgroud)

有没有办法表达选择

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

得到

replaced
________________________
Xanadu_did_Kubla
stately_pleasure_dome
Alph_the_sacred_river
caverns_measureless_to
to_a_s
Run Code Online (Sandbox Code Playgroud)

请注意:

  1. 正则表达式s///I提供的内容远不如真实数据库包含的那么复杂
  2. 不幸的是我无法规范化数据库..

Eri*_*ric 5

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

select replace(col, 'e', 'i') from tbl
Run Code Online (Sandbox Code Playgroud)

这将返回regexrigix.

至于你具体的例子,你必须使用的组合locatesubstring:

select 
    substring(col
        , locate('_', col)+1
        , locate('_', reverse(col))-(len(col)-locate('_', col)-1)) 
from tbl
Run Code Online (Sandbox Code Playgroud)

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