2

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

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() 来拆分部分,但如果加星标的单词不止一个,那将失败。

4

2 回答 2

2

您可以创建一个 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 中编写这样的函数。

于 2013-09-09T14:05:52.413 回答
1

来自 Postgresql 邮件列表的回答:

是的,您不能在“替换为”部分中嵌入函数调用结果;它必须是文字(当然允许组插入元序列)。

我看到了两种可能的方法。

1)使用 pl/perl(或其一些变体),它具有执行此操作的功能。

2) 使用 regexp_matches(,,'g') 将输入字符串分解为其组成部分。您可以将其分解,以便原始字符串的每个字符都在输出中,不同的列包含每个匹配项的“原始”和“修改”部分。这将在子查询中完成,然后在父查询中,您将“string_agg(...)”将匹配重新组合在一起,同时操作所需的列“ie, string_agg(c1 || upper(c3))”

高温高压

大卫·J。

于 2013-09-09T13:51:37.157 回答