正则表达式regexp_replace的使用方法
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">前言</a></li><li><a href="#_label1">常用案例</a></li><li><a href="#_label2">总结</a></li></ul></div><p class="maodian"><a name="_label0"></a></p><h2>前言</h2><p>regexp_replace的使用非常灵活,且容易忘记,故做此笔记。 没有过多的介绍使用说明,只是根据个人理解列出很多相似案例,个人觉得通过对比,更容易理解几个参数的使用技巧。</p>
<p>所有案例均是实跑出来的结果。</p>
<p>带颜色的部分是需要留意的地方。</p>
<p><strong>命令格式:</strong></p>
<blockquote><p> regexp_replace(source, pattern, replace_string, occurrence)</p></blockquote>
<p><strong>参数说明:</strong></p>
<p>● source: string类型,要替换的原始字符串。</p>
<p>● pattern: string类型常量,要匹配的正则模式,pattern为空串时抛异常。</p>
<p>● replace_string:string,将匹配的pattern替换成的字符串。</p>
<p>● occurrence: bigint类型常量,必须大于等于0,</p>
<p>大于0:表示将第几次匹配替换成replace_string,</p>
<p>等于0:表示替换掉所有的匹配子串。</p>
<p>其它类型或小于0抛异常。</p>
<p><strong>返回值:</strong></p>
<p>将source字符串中匹配pattern的子串替换成指定字符串后返回,当输入source, pattern, occurrence参数为NULL时返回NULL,若replace_string为NULL且pattern有匹配,返回NULL,replace_string为NULL但pattern不匹配,则返回原串。</p>
<p class="maodian"><a name="_label1"></a></p><h2>常用案例</h2>
<p>1、用’#‘替换字符串中的所有数字</p>
<div class="jb51code"><pre class="brush:sql;">SELECT regexp_replace('01234abcde56789','','#') AS new_str FROM dual;</pre></div>
<p>结果:#####abcde#####</p>
<p>用’#‘替换字符串中的数字0、9</p>
<div class="jb51code"><pre class="brush:sql;">SELECT regexp_replace(‘01234abcde56789','','#') AS new_str FROM dual;</pre></div>
<p>结果:#1234abcde5678#</p>
<p>2、遇到<strong>非</strong>小写字母或者数字跳过,从匹配到的第4个值开始替换,替换为''</p>
<div class="jb51code"><pre class="brush:sql;">SELECT regexp_replace('abcdefg123456ABC','','',4)</pre></div>
<p>结果:abcefg123456ABC</p>
<div class="jb51code"><pre class="brush:sql;">SELECT regexp_replace('abcDEfg123456ABC','','',4)</pre></div>
<p>结果:abcDEg123456ABC</p>
<div class="jb51code"><pre class="brush:sql;">SELECT regexp_replace('abcDEfg123456ABC','','',7);</pre></div>
<p>结果:abcDEfg13456ABC</p>
<p>遇到非小写字母或者数字跳过,将所有匹配到的值替换为''</p>
<div class="jb51code"><pre class="brush:sql;">SELECT regexp_replace('abcDefg123456ABC','','',0);</pre></div>
<p>结果:DABC</p>
<p>3、格式化手机号,将+86 13811112222转换为(+86) 138-1111-2222,’+‘在正则表达式中有定义,需要转义。\\1表示引用的第一个组<br />SELECT regexp_replace('+86 13811112222','(\\+{2})( )({3})({4})({4})','(\\1)\\3-\\4-\\5',0);</p>
<p>结果:(+86)138-1111-2222</p>
<div class="jb51code"><pre class="brush:sql;">SELECT regexp_replace("123.456.7890","([[:digit:]]{3})\\.([[:digit:]]{3})\\.([[:digit:]]{4})","(\\1)\\2-\\3",0) ;
SELECT regexp_replace("123.456.7890","({3})\\.({3})\\.({4})","(\\1)\\2-\\3",0) ;</pre></div>
<p>结果:(123)456-7890</p>
<p>4、将字符用空格分隔开,0表示替换掉所有的匹配子串。</p>
<div class="jb51code"><pre class="brush:sql;"> SELECT regexp_replace('abcdefg123456ABC','(.)','\\1 ',0) AS new_str FROM dual;</pre></div>
<p>结果:a b c d e f g 1 2 3 4 5 6 A B C</p>
<div class="jb51code"><pre class="brush:sql;"> SELECT regexp_replace('abcdefg123456ABC','(.)','\\1 ',2) AS new_str FROM dual;</pre></div>
<p>结果:ab cdefg123456ABC</p>
<p>5、</p>
<div class="jb51code"><pre class="brush:sql;">SELECT regexp_replace("abcd","(.*)(.)$","\\1",0) ;
</pre></div>
<p>结果:abc</p>
<div class="jb51code"><pre class="brush:sql;">SELECT regexp_replace("abcd","(.*)(.)$","\\2",0) ;
</pre></div>
<p>结果:d</p>
<div class="jb51code"><pre class="brush:sql;">SELECT regexp_replace("abcd","(.*)(.)$","\\1-\\2",0) ;
</pre></div>
<p>结果:abc-d</p>
<p>其他案例:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT regexp_replace("abcd","(.)","\\2",1) 结果为"abcd",因为pattern中只定义了一个组,引用的第二个组不存在。
SELECT regexp_replace("abcd","(.*)(.)$","\\2",0) 结果为"d"
SELECT regexp_replace("abcd","(.*)(.)$","\\1",0) 结果为"abc"
SELECT regexp_replace("abcd","(.*)(.)$","\\1-\\2",0) 结果为"abc-d"
SELECT regexp_replace("abcd","a","\\1",0),结果为” \1bcd”,因为在pattern中没有组的定义,所以\1直接输出为字符。</pre></div>
<p><strong>正则符号释义:</strong></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202207/202207270952403.png" /></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202207/202207270952404.jpg" /></p>
<p class="maodian"><a name="_label2"></a></p><h2>总结</h2>
頁:
[1]