在Postgresql中用大写版本替换正则表达式匹配的文本

时间:2013-09-09 12:57:15

标签: regex postgresql replace

给出一个字符串,其中某些单词被星星包围,例如

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()来分割部分,但是如果有多个单词加星标则会失败。

2 个答案:

答案 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中编写此类功能。