给出一个字符串,其中某些单词被星星包围,例如
The *quick* *brown* fox jumped over the *lazy* dog
你可以将星星包围的词转换成大写版本,即
QUICK BROWN狐狸跳过了LAZY狗
在表'句子'中的列'句子'中给出文本,我可以标记/提取单词如下:
SELECT regexp_replace(sentence,'\*(.*?)\*','STARTUPPER\1ENDUPPER','g') FROM sentences;
但我第一次尝试大写转换不起作用:
select regexp_replace(sentence,'\*(.*?)\*','' || upper('\1'),'g') from sentences;
我想在使用开始和结束标记替换星星后使用substring()来分割部分,但是如果有多个单词加星标则会失败。
答案 0 :(得分:1)
来自Postgresql邮件列表的回答:
是的,你不能在“替换为”部分中嵌入函数调用结果; 它必须是一个文字(允许组插入元序列 疗程)。
我看到两种可能的方法。
1)使用具有设施的pl / perl(或其某些变体) 此
2)使用regexp_matches(,,'g')将输入字符串分解为其组件 部分。你可以爆炸它,以便原始字符串的每个字符都在 包含“raw”和“to modify”的不同列的输出 每场比赛的部分内容。这将在子查询中完成,然后在 父查询你将“string_agg(...)”匹配回来 操纵所需的列“即,string_agg(c1 || upper(c3))”
HTH
David J。
答案 1 :(得分:1)
您可以创建一个PL / pgSQL函数,如:
CREATE FUNCTION upper_asterisk(inp_str varchar)
RETURNS varchar AS $$
DECLARE t_str varchar;
BEGIN
FOR t_str IN (SELECT regexp_matches(inp_str,'\*.+\*','g'))
BEGIN
inp_str := replace(inp_str, t_str, upper(t_str));
END;
RETURN inp_str;
END;
$$ LANGUAGE plpgsql;
(未经测试,可能有错误)。
或使用任何可用语言在DB中编写此类功能。