我需要将所有空格替换为两个特定符号(@和&)之间的%。如下所示:
'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和其他站点中的所有相关问题,但无法获得有用的答案。
答案 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';
我们创建一个带有三个参数的函数,startChar
,endChar
和textToParse
包含将被修剪的文本。
我们首先基于startChar
和endChar
创建一个正则表达式。如果startChar
的值为@
,而endChar
的值为&
,我们将得到以下正则表达式:
(@[^&]*)( )(.*&)
此正则表达式由三组组成:
(@[^&]*)
-该组匹配@和一个空格字符之间的文本-'';
( )
-该组匹配一个空格字符。
(.*&)
-该组匹配空格字符和&
字符之间的文本。
为了替换空格(第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
因此。