posix正则表达式拆分表

时间:2013-06-10 10:58:26

标签: regex postgresql posix

我目前正致力于PostgreSQL中的数据迁移。由于我是posix正则表达式的新手,我在使用简单模式时遇到了一些麻烦,非常感谢你的帮助。

我希望有一个正则表达式将我的表拆分成一列中的每个字母数字字符,例如。当列包含字符串'abc'时,我想将其拆分为3行:['a', 'b', 'c']。我需要一个正则表达式

第二种情况稍微复杂一些,我想将表达式'105AB'拆分为['105A', '105B'],我想复制字符串开头的数字并拆分表格在大写字母上,最后用正好1个大写字母连接数字。

我将使用的功能可能是regexp_split_to_table(string, regexp)

我故意提供的数据非常少,不会让任何人感到困惑,因为我发布的是问题的本质。如果您需要更多信息,请发表评论。

1 个答案:

答案 0 :(得分:1)

第一个已经由你解决了:

select regexp_split_to_table(s, ''), i
from (values
    ('abc', 1),
    ('def', 2)
) s(s, i);
 regexp_split_to_table | i 
-----------------------+---
 a                     | 1
 b                     | 1
 c                     | 1
 d                     | 2
 e                     | 2
 f                     | 2

在第二种情况下,你没有说数字是否总是第一个树字符:

select
    left(s, 3) || regexp_split_to_table(substring(s from 4), ''), i
from (values
    ('105AB', 1),
    ('106CD', 2)
) s(s, i);
 ?column? | i 
----------+---
 105A     | 1
 105B     | 1
 106C     | 2
 106D     | 2

对于可变数量的数字:

select n || a, i
from (
    select
        substring(s, '^\d{1,3}') n,
        regexp_split_to_table(substring(s, '[A-Z]+'), '') a,
        i
    from (values
        ('105AB', 1),
        ('106CD', 2)
    ) s(s, i)
) s;
 ?column? | i 
----------+---
 105A     | 1
 105B     | 1
 106C     | 2
 106D     | 2