我怎么能为postgresql编写这个正则表达式?

时间:2015-08-06 18:31:04

标签: regex postgresql

我怎么能写这个正则表达式?

origin => 'fo3o321bar423ba 234 z' result => “fo 3 o 321 bar 423 ba 234 z”

select regexp_replace(trim(regexp_replace(trim(regexp_replace('fo3o321bar423ba 234 z', E'([a-z]*[0-9]*)', E'\\1 ', 'g')), E'([0-9]*[a-z]*)', E'\\1 ', 'g')),'[\s.]+', ' ', 'g')

2 个答案:

答案 0 :(得分:1)

您可以使用以下regexp_replace

实现您想要的效果
SELECT regexp_replace('fo3o321bar423ba 234 z', '([^0-9]|^)([0-9]+)(?=[^0-9]|$)', '\1 \2 ', 'g');

请参阅demo

结果:fo 3 o 321 bar 423 ba 234 z

正则表达式匹配:

  • (^|[^0-9]) - 字符串开头或非数字并存储在第1组
  • ([0-9]+) - 一位或多位
  • (?=[^0-9]|$) - 前瞻检查后面是否有非数字或字符串结尾。

替换字符串 - '\1 \2 ' - 返回引用模式中定义的捕获的组1和2 (...)

'g'表示我们想要替换所有出现的事件,而不仅仅是第一次出现。

答案 1 :(得分:0)

你可能需要一个功能来完成它。 PL / Perl可能是最好的,因为Perl支持正则表达式后瞻,但这里有一些有效的JavaScript,因为我只有:

create extension if not exists plv8;

create or replace function delim(s text) returns text language plv8 as $$
    var match;
    var result = [];
    while (Boolean(match = s.match(/([A-Z]+|[A-Z]?[a-z]+|[0-9]+|([^a-zA-Z0-9])+)$/))) {
        if (!match[2]) {
            result.unshift(match[1]); /* don't return non alphanumeric tokens */
        }
        s = s.substring(0, s.length - match[1].length);
    }
    return result.join(" ");
$$;


select delim('fo3o321bar423ba 234 z'); --result fo 3 o 321 bar 423 ba 234 z