云在天上 發表於 2022-9-29 10:44:04

教你用正则表达式提取数字和小数点

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1、初识</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">1.1、纯数字提取</a></li><li><a href="#_lab2_0_1">1.2、带有小数点数字提取</a></li></ul><li><a href="#_label1">2、语法</a></li><ul class="second_class_ul"></ul><li><a href="#_label2">3、实例代码</a></li><ul class="second_class_ul"></ul><li><a href="#_label3">4、参考Demo</a></li><ul class="second_class_ul"></ul><li><a href="#_label4">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>1、初识</h2>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>1.1、纯数字提取</h3>
<div class="jb51code"><pre class="brush:sql;">-- "提取123abc提取":提取当前字符当中的123

-- 1.Hive:
select regexp_replace('提取123abc提取','[^0-9]+','')    "123"
select regexp_replace('提取123abc提取','\D','')      "提取123abc提取"

-- 2.PG: 'g':global,全局替换
select regexp_replace('提取123abc提取','[^0-9]+','','g' )   "123"
select regexp_replace('提取123abc提取','\D','','g' )      "123"
</pre></div>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>1.2、带有小数点数字提取</h3>
<div class="jb51code"><pre class="brush:sql;">-- "提取123.11abc提取":提取当前字符当中的123.11

-- 1.Hive:小数或者整数数据提取
select regexp_extract('提取123.11abc提取','+([.]{1}+){0,1}',0)    "123.11"
select regexp_extract('提取123abc提取','+([.]{1}+){0,1}',0)   "123"

-- 2.PG:
select regexp_replace('提取123.11abc提取','[^\d.\d]','','g') "123.11"
</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>2、语法</h2>
<table><thead><tr><th>字符</th><th>说明</th><th>等效于</th></tr></thead><tbody><tr><td>\</td><td>将下一字符标记为特殊字符、文本、反向引用或八进制转义符。<br />e.g:&ldquo;n&quot;匹配字符&quot;n&rdquo;。&quot;\n&quot;匹配换行符。序列&quot;\\&ldquo;匹配&rdquo;&quot;,&quot;\(&ldquo;匹配&rdquo;(&quot;</td><td>&nbsp;</td></tr><tr><td>^</td><td>匹配输入字符串开始的位置</td><td>&nbsp;</td></tr><tr><td>$</td><td>匹配输入字符串结束的位置</td><td>&nbsp;</td></tr><tr><td>*</td><td>零次或多次匹配前面的字符或子表达式</td><td>{0,}</td></tr><tr><td>+</td><td>一次或多次匹配前面的字符或子表达式</td><td>{1,}</td></tr><tr><td>?</td><td>零次或一次匹配前面的字符或子表达式</td><td>{0,1}</td></tr><tr><td>{n}</td><td>n是非负整数。正好匹配n次。<br />e.g:&quot;o{2}&quot;与&quot;job&quot;中的&quot;o&quot;不匹配,但与&quot;food&quot;中的两个&quot;o&quot;匹配</td><td>&nbsp;</td></tr><tr><td>{n,}</td><td>n是非负整数。至少匹配n次。<br />e.g:&quot;o{2,}&ldquo;不匹配&quot;job&quot;中的&quot;o&rdquo;,而匹配&quot;fooooood&quot;中的所有o</td><td>&quot;o{1,}&ldquo;等效于&quot;o+&rdquo;<br />&quot;o{0,}&ldquo;等效于&quot;o*&rdquo;</td></tr><tr><td>{n,m}</td><td>m和n是非负整数,其中n&lt;=m。匹配至少n次,至多m次。<br />e.g:&quot;o{1,3}&quot;匹配&quot;fooooooood&quot;中的头三个o</td><td>&quot;o{0,1}&ldquo;等效于&quot;o?&rdquo;</td></tr><tr><td>?</td><td>当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后,<br />匹配模式是&ldquo;非贪心匹配&rdquo;。&ldquo;非贪心匹配&rdquo;:匹配搜索到的尽可能短的字符串,<br />而默认的&ldquo;贪心匹配&rdquo;则是匹配搜索到尽可能长的字符串。<br />e.g:&quot;oooo&quot;中,&quot;o+?&ldquo;只能够匹配出单个&quot;o&rdquo;;而&quot;o+&ldquo;匹配出所有的&quot;o&rdquo;</td><td>&nbsp;</td></tr><tr><td>.</td><td>匹配除&quot;\r\n&quot;之外的任何单个字符</td><td>&nbsp;</td></tr><tr><td></td><td>字符集。匹配包含的任一字符。<br />e.g:&quot;&ldquo;匹配&quot;plain&quot;中的&quot;a&rdquo;</td><td>&nbsp;</td></tr><tr><td>[^xyz]</td><td>反向字符集。匹配未包含的任何字符。<br />e.g:&quot;[^abc]&ldquo;匹配&quot;plain&quot;中&quot;p&rdquo;,&ldquo;l&rdquo;,&ldquo;i&rdquo;,&ldquo;n&rdquo;</td><td>&nbsp;</td></tr><tr><td></td><td>字符范围。匹配指定范围内的任何字符。<br />e.g:&quot;&quot;匹配&quot;a&quot;到&quot;z&quot;范围内的任何小写字母</td><td>&nbsp;</td></tr><tr><td>[^a-z]</td><td>反向范围字符。匹配不在指定范围内的任何字符。<br />e.g:&quot;[^a-z]&quot;匹配任何不在&quot;a&quot;到&quot;z&quot;范围内的任何字符</td><td>&nbsp;</td></tr><tr><td>\d</td><td>数字字符匹配。</td><td></td></tr><tr><td>\D</td><td>非数字字符匹配。</td><td>[^0-9]</td></tr><tr><td>\s</td><td>匹配任何空白字符,包括空格、制表符、换页符等</td><td>&nbsp;</td></tr><tr><td>\S</td><td>匹配任何非空白字符</td><td>&nbsp;</td></tr><tr><td>\w</td><td>匹配任何类字符,包括下划线</td><td></td></tr><tr><td>\W</td><td>与任何非单词字符匹配</td><td>[^A-Za-z0-9_]</td></tr><tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr></tbody></table>
<p class="maodian"><a name="_label2"></a></p><h2>3、实例代码</h2>
<div class="jb51code"><pre class="brush:sql;">-- PG:regexp_match:匹配函数
select regexp_match('会议事业部69.57%/','[\d.\d]{1,}')        "{69.57}"
select regexp_match('会议事业部69%57%/','[\d%\d]{1,}')        "{69%57%}"
-- 子表达式中:[\d.\d]:这时候:'.' 不再是匹配除"\r\n"之外的任何单个字符
select regexp_match('会议事业部69%57%/','[\d.\d]{1,}')        "{69}"
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>4、参考Demo</h2>
<blockquote><p>-- PostgreSQL正则表达使用<br />https://blog.csdn.net/qq_22994783/article/details/82699559<br />-- Hive常用正则表达式<br />https://cloud.tencent.com/developer/article/1538552</p></blockquote>
<p class="maodian"><a name="_label4"></a></p><h2>总结</h2>
頁: [1]
查看完整版本: 教你用正则表达式提取数字和小数点