REGEXP_REPLACE替换两个符号之间的空格

时间:2019-01-08 19:17:09

标签: postgresql pattern-matching

我需要将所有空格替换为两个特定符号(@和&)之间的%。如下所示:

'this @ is test   &that did not @turn& out well' 

应转换为

'this @%is%test%&that did not @turn& out well'

'@pattern matching&  is my number one enemy'

'@pattern%matching&  is my number one enemy'

我几乎阅读了stackoverflow和其他站点中的所有相关问题,但无法获得有用的答案。

1 个答案:

答案 0 :(得分:1)

一种(效率低下)的方法是进行多个REGEXP_REPLACE调用。

例如,让我们看一下下面的plpgsql函数。

CREATE OR REPLACE FUNCTION replaceSpacesBetweenTwoSymbols(startChar TEXT, endChar TEXT, textToParse TEXT)
    RETURNS TEXT
AS $$
DECLARE resultText TEXT := textToParse;
DECLARE tempText TEXT := textToParse;
BEGIN
    WHILE TRUE LOOP
        tempText = REGEXP_REPLACE(resultText,
                                  '(' || startChar || '[^' || endChar || ']*)' || '( )(.*' || endChar || ')',
                                  '\1%\3');
        IF tempText = resultText
        THEN RETURN resultText;
        END IF;
        resultText := tempText;
    END LOOP;
    RETURN resultText;

END;
$$
LANGUAGE 'plpgsql';

我们创建一个带有三个参数的函数,startCharendChartextToParse包含将被修剪的文本。

我们首先基于startCharendChar创建一个正则表达式。如果startChar的值为@,而endChar的值为&,我们将得到以下正则表达式:

(@[^&]*)( )(.*&)

此正则表达式由三组组成:

  1. (@[^&]*)-该组匹配@和一个空格字符之间的文本-'';

  2. ( )-该组匹配一个空格字符。

  3. (.*&)-该组匹配空格字符和&字符之间的文本。

为了替换空格(第2组),我们使用以下REGEXP_REPLACE调用:

REGEXP_REPLACE(resultText,' (@[^&]*)( )(.*&)', '\1%\3')

从该表达式中,您可以看到我们正在用%字符替换第二组(空格)。

这样,每执行一次REGEXP_REPLACE,我们将只替换一个空格。 一旦发现不再需要替换空格,我们将返回修改后的TEXT。 在这一刻,空格用%字符代替。我们需要做的最后一件事是用单个%替换多个连续的%字符。

可以在结尾再进行另一个REGEXP_REPLACE调用来完成。 例如:

SELECT REGEXP_REPLACE(replaceSpacesBetweenTwoSymbols('@','&','this @ is test   &that did not @turn& out well'),'%{2,}','%');

会返回

  

这个@%is%test%&表现不佳

因此,

SELECT REGEXP_REPLACE(replaceSpacesBetweenTwoSymbols('@','&','this is @a more  complex& task @test a a & w'),'%{2,}','%');

将返回

  

这是@ a%more%complex&任务@ test%a%a%&w

因此。