题解 | #截取出年龄#
截取出年龄
https://www.nowcoder.com/practice/b8d8a87fe1fc415c96f355dc62bdd12f
使用正则表达式解决
三个函数
1.REGEXP_SUBSTR 函数
REGEXP_SUBSTR ( source_string, pattern [, position [, occurrence [, parameters ] ] ] )
source_string
要搜索的字符串表达式(如列名称)。
pattern
表示 SQL 标准正则表达式模式的字符串文本。
position
指示在 source_string 中开始搜索的位置的正整数。此位置基于字符数而不是字节数,这是为了将多字节字符作为单字符计数。默认值为 1。如果 position 小于 1,则搜索从 source_string 的第一个字符开始。如果 position 大于 source_string 中的字符数量,则结果为空字符串 ("")。
出现
一个正整数,指示要使用的模式的匹配项。REGEXP_SUBSTR 会跳过第一个 occurrence -1 匹配项。默认值为 1。如果 occurrence 小于 1 或大于 source_string 中的字符串,则会忽略搜索,并且结果为 NULL。
参数
一个或多个字符串,指示函数与模式的匹配方式。可能的值包括:
i – 执行不区分大小写的匹配。
e – 使用子表达式提取子字符串。
如果 pattern 包含一个子表达式,REGEXP_SUBSTR 会使用 pattern 中的第一个子表达式来匹配子字符串。REGEXP_SUBSTR 仅考虑第一个子表达式;其他子表达式会被忽略。如果模式没有子表达式,REGEXP_SUBSTR 会忽略“e”参数。
p – 使用 Perl 兼容正则表达式 (PCRE) 方言解释模式。
2.?=... 正先行断言
?=... 正先行断言,表示第一部分表达式之后必须跟着 ?=...定义的表达式。
返回结果只包含满足匹配条件的第一部分表达式。 定义一个正先行断言要使用 ()。在括号内部使用一个问号和等号: (?=...)。
正先行断言的内容写在括号中的等号后面。 例如,表达式 (T|t)he(?=\sfat) 匹配 The 和 the,在括号中我们又定义了正先行断言 (?=\sfat) ,即 The 和 the 后面紧跟着 (空格)fat。
"(T|t)he(?=\sfat)" => >The fat cat sat on the mat.
3.?<= ... 正后发断言
正后发断言 记作(?<=...) 用于筛选所有匹配结果,筛选条件为 其前跟随着断言中定义的格式。
"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.
select regexp_substr(profile, '(?<=(,))[0-9]{2}(?=,)') as age, count(*) as number from user_submit group by age;