从字符串值中提取8个字母数字字符

时间:2018-08-17 06:23:11

标签: sql regex hive

我正在尝试从字符串值中找到一个字母数字8字符。例如:如果我的字符串是//SC202646 ABCBUB22XXX,则它应该提取ABCBUB22或满足8个字母数字字符长度的条件的任何值。 我正在通过sql执行它,并想使用regex函数将其提取

1 个答案:

答案 0 :(得分:0)

您可以使用下面的查询来获取结果。看起来有点复杂,但是可以正常工作。

select regexp_substr(sub1, '[A-Za-z0-9]{8}', 1)
  from (select regexp_substr('<input the string here >', '[^ ]+', 1, level) sub1 from dual
              connect by level <= REGEXP_COUNT('< input the string here >', '[^ ]+'))
  where regexp_count(sub1,'[^a-zA-Z0-9]')=0 AND regexp_count(sub1,'[a-zA-Z0-9]')>=8;

请考虑以下示例。

测试字符串为:// SC202646 ABCBUB22XXX ASFD1234 qwer // s aaddf123456

首先在内部查询中,我们根据空格分隔每个单词。内部查询的结果是

select regexp_substr('//SC202646 ABCBUB22XXX ASFD1234 qwer//s aaddf123456 ', '[^ ]+', 1, level) sub1 from dual
     connect by level <= REGEXP_COUNT('//SC202646 ABCBUB22XXX ASFD1234 qwer//s aaddf123456 ', '[^ ]+');

结果:

//SC202646
ABCBUB22XXX
ASFD1234
qwer//s
aaddf123456

然后在外部查询中,我们对数据进行过滤,使其仅应包含字母数字字符,并且至少应包含8个字符,然后显示前8个字符。

所以最终的查询和输出是

select regexp_substr(sub1, '[A-Za-z0-9]{8}', 1)
  from (select regexp_substr('//SC202646 ABCBUB22XXX ASFD1234 qwer//s aaddf123456 ', '[^ ]+', 1, level) sub1 from dual
        connect by level <= REGEXP_COUNT('//SC202646 ABCBUB22XXX ASFD1234 qwer//s aaddf123456 ', '[^ ]+'))
 where regexp_count(sub1,'[^a-zA-Z0-9]')=0 AND regexp_count(sub1,'[a-zA-Z0-9]')>=8;

结果:

ABCBUB22
ASFD1234
aaddf123