我怎么能写这个正则表达式?
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')
答案 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