让决策更智能
新一代智能数据分析平台

正则表达式的基本使用

观小远发表于:2020年09月24日 18:48:47更新于:2022年04月26日 11:31:46


使用正则表达式进行字段处理

1.基本语法

平台公式:REGEXP_EXTRACT(字符串、正则表达式、索引)、REGEXP_REPLACE(待替换的字符串、正则表达式、需要替换成的内容)

正则表达式常用语法:

0015f6c771e8eec9ac3992c47e5ef2a

0015f6c771eaa555eb38f562318b691

2.常见应用场景

2.1 仅截取数字

如果字段中的数字字段是单个的整数数字,如: ABC123ABC、A1B2C3

REGEXP_EXTRACT(字符串,’\\d+’,0) 索引0表示返回匹配到的全部值,此处有一个问题,上面说到\d为匹配数字0-9,+为匹配1次或多次字符,为什么这里要用\\呢,是因为在字符串中的\\被识别成了\,而单独在字符串中使用\是无效的, 可以理解为第一个\将第二个\转意成了\d中的\

如果要截取小数,如 ABC1.11CCC

REGEXP_EXTRACT (字符串,’\\d+\\.?\\d*’,0) 其中\\d+表示截取小数点前的数字,\\.?表示 匹配小数点,但也有可能没有小数点,恰好是整数,但最多只能出现一次小数点,所以使用?而不是使用+或*,后面的\\d*表示截取小数点后的数字,可能没有,也可能有多位

 

2.2截取中文

截取一段字段中的中文部分,比如’19483-珠海华发世纪城’中截取中文的部分

REGEXP_EXTRACT(字符串,'[\u4e00-\u9fa5]+',0)  但是这样的方法在以下的情况中并不适用:如19483-达拉斯理查德森店---令人头疼的店,后面的’令人头疼的店’不能被截取,原因是Extract函数在截取被符号或其它字符打断以后就不再截取后面的中文字符了,如下图所示:

0015f6c78db4554898f9ea5a7448982

在这种情况下可以尝试使用Replace 函数:

REGEXP_REPLACE(字符串,'[^\u4e00-\u9fa5]+','')

结果如下图所示:

0015f6c78ebc6c88ef0824a19f5e2e2

其中^符号在[ ]外的时候意义为匹配字符串开始位置的文字,而当^符号放在中括号内的时候则表示为not的意思,此处为将非中文字符的字符替换为空字符串。

2.3 截取字母

REGEXP_EXTRACT([SmartETL],'[A-Za-z]+',0) 其中A-Z表示大写字母,a-z表示小写字母,但这一办法统一会被中间的其它符号或文字打断,如图:

0015f6c78f85bd75ac68fe683747e2a 

因此,使用REGEXP_REPLACE([SmartETL],'[^A-Za-z]+',''),结果如图:

0015f6c791134d3cc1d2357b018a7ca

此外,如果在REGEXP_EXTRACT([SmartETL],'[A-Za-z]+',0)的中括号外加一个^用来定义从字段的开头开始匹配,那么会产生如下的效果:

0015f6c7946ea82d13246c5e80946b8 

原因是开头的两个字符不是字母从而一开始就被中断了。

 

2.4 项目中的案例

取每袋/片数中的规格单位:

首先,如果规格单位统一是中文的话则可使用上面说的提取中文的方法进行提取,但是如果出现了规格单位为英文的情况就不行了,所以使用以下的方法:

REGEXP_EXTRACT([每袋/片数],'[^min:0-9-\s]+',0)

解析:^表示不包含,min:表示匹配‘min:’的字符串,0-9表示匹配数字,-表示匹配符号‘-’,\S表示匹配空格,这些在中括号中表示‘排除符合以上的所有情况’,最后+表示重复匹配1次或多次。结果如图:(注意这里不能使用*或者?号)

0015f6c79634c3c51cf58a3e432cfe1 

 

再在上述问题中取出每个记录的上下限,比如39-45片,则下限为39,上限为45

下限:REGEXP_EXTRACT(REGEXP_REPLACE([每袋/片数],'-.+',''),'\\d+',0)

先用-.+截出所有在-符号以及其后面的字符,其中.匹配所有字符,然后替换为空值,再通过\\d+截取剩余的数字

上限:REGEXP_EXTRACT(REGEXP_REPLACE([每袋/片数],'.+-',''),'\\d+',0)

先用.+-截出所有-符号以及其前面的字符,然后替换为空值,再通过\\d+截取剩余的数字

 

 


    您需要登录后才可以回复