最近开发遇到一个新的东西,需要将里面的数字提取出来,下面这篇文章主要给大家介绍了关于用正则表达式提取数字和小数点的相关资料,需要的朋友可以参考下
一、基础知识
1、纯数字提取
1
2
3
4
5
6
7
8
9
-- "提取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"
2、带有小数点数字提取
1
2
3
4
5
6
7
8
-- "提取123.11abc提取":提取当前字符当中的123.11
-- 1.Hive:小数或者整数数据提取
select regexp_extract('提取123.11abc提取','[0-9]+([.]{1}[0-9]+){0,1}',0) "123.11"
select regexp_extract('提取123abc提取','[0-9]+([.]{1}[0-9]+){0,1}',0) "123"
-- 2.PG:
select regexp_replace('提取123.11abc提取','[^\d.\d]','','g') "123.11"
二、语法
字符 说明 等效于
\ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。
e.g:“n"匹配字符"n”。"\n"匹配换行符。序列"\\“匹配”","\(“匹配”("
^ 匹配输入字符串开始的位置
$ 匹配输入字符串结束的位置
* 零次或多次匹配前面的字符或子表达式 {0,}
+ 一次或多次匹配前面的字符或子表达式 {1,}
? 零次或一次匹配前面的字符或子表达式 {0,1}
{n} n是非负整数。正好匹配n次。
e.g:"o{2}"与"job"中的"o"不匹配,但与"food"中的两个"o"匹配
{n,} n是非负整数。至少匹配n次。
e.g:"o{2,}“不匹配"job"中的"o”,而匹配"fooooood"中的所有o "o{1,}“等效于"o+”
"o{0,}“等效于"o*”
{n,m} m和n是非负整数,其中n<=m。匹配至少n次,至多m次。
e.g:"o{1,3}"匹配"fooooooood"中的头三个o "o{0,1}“等效于"o?”
? 当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后,
匹配模式是“非贪心匹配”。“非贪心匹配”:匹配搜索到的尽可能短的字符串,
而默认的“贪心匹配”则是匹配搜索到尽可能长的字符串。
e.g:"oooo"中,"o+?“只能够匹配出单个"o”;而"o+“匹配出所有的"o”
. 匹配除"\r\n"之外的任何单个字符
[xyz] 字符集。匹配包含的任一字符。
e.g:"[abc]“匹配"plain"中的"a”
[^xyz] 反向字符集。匹配未包含的任何字符。
e.g:"[^abc]“匹配"plain"中"p”,“l”,“i”,“n”
[a-z] 字符范围。匹配指定范围内的任何字符。
e.g:"[a-z]"匹配"a"到"z"范围内的任何小写字母
[^a-z] 反向范围字符。匹配不在指定范围内的任何字符。
e.g:"[^a-z]"匹配任何不在"a"到"z"范围内的任何字符
\d 数字字符匹配。 [0-9]
\D 非数字字符匹配。 [^0-9]
\s 匹配任何空白字符,包括空格、制表符、换页符等
\S 匹配任何非空白字符
\w 匹配任何类字符,包括下划线 [A-Za-z0-9_]
\W 与任何非单词字符匹配 [^A-Za-z0-9_]
————————————————