如何仅将一组空行替换为空行?

  • 本文关键字:替换 一组 何仅 regex oracle
  • 更新时间 :
  • 英文 :


我想用 2 个换行符替换每个出现超过 3 次的换行符。

例:

'
line
line after en empty line

line after 2 empty line
line after 0 empty lines
'

必须成为那个

'
line
line after en empty line

line after 2 empty lines
line after 0 empty lines
'

我试过了

SELECT REGEXP_REPLACE (mytext,'*(' || CHR (10) || ')+',  CHR (10)) FROM DUAL;

但它用 2 个换行符替换所有换行符组。

'
line
line after en empty line

line after 2 empty lines
line after 0 empty lines
'

我试过了

SELECT REGEXP_REPLACE (mytext, '{2,}(' || CHR (10) || ')+',  CHR (10) || CHR (10)) FROM DUAL;

因为文档 (https://www.techonthenet.com/oracle/functions/regexp_replace.php)

{m,}至少匹配m次。

但结果是一样的。

如何仅将一组空行替换为空行?

更新: 建议的代码

REGEXP_REPLACE (mytext, CHR(10) || '{2,}',  CHR(10) || CHR(10))

适用于快速每种情况,但不适用于以下情况:

'


line after n empty lines
'

成为

'

line after 2 empty lines
'

因为第一行之前没有 chr(10)。

我更改了模式以匹配以考虑到这一点:

SELECT REGEXP_REPLACE ((mytext, CHR(10) || '{2,}) | (' || CHR(10) || '{1,}),  CHR(10) || CHR(10)) FROM DUAL;

但在这种情况下,我必须只添加一个换行符。 我怎么写?

我想用

2 个换行符替换每个超过 3 次的换行符。

您可以使用以下方法替换三个或更多换行符的实例:

SELECT REGEXP_REPLACE(value, CHR(10) || '{3,}', CHR(10) || CHR(10))
AS replaced_value
FROM   table_name;

其中,对于示例数据:

CREATE TABLE table_name (value) AS
SELECT 'line
line after an empty line

line after 2 empty line
line after 0 empty lines'
FROM   DUAL;

输出:

<th style="text-align: left;">REPLACED_VALUE
行 2 空行后行 0 空行




计数器放在错误的位置。它必须在您要重复的表达式之后,而不是在它之前。

您希望将至少出现两次的所有换行符替换为双换行符:

REGEXP_REPLACE (mytext, CHR(10) || '{2,}',  CHR(10) || CHR(10)) 

演示:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=f0051da5b892d1b0401c90530bb36e12

对于少换行的第一行,最好的选择可能是暂时添加换行符(即在使用SUBSTRREGEXP_REPLACE后将其删除)。所以最后的表达式变成:

SUBSTR(REGEXP_REPLACE (CHR(10) || mytext, CHR(10) || '{2,}',  CHR(10) || CHR(10)), 2)

演示:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=fd4909a01a2496e449104c35343ca3f1

我们需要使用CHR(10){2,}来指定我们将 2 个或更多次出现的换行符替换为 2 个换行符CHR(10) || CHR(10)

create table test (col varchar(1000));
insert into test (col) values
('line
line after en empty line

line after 2 empty line
line after 0 empty lines');
select * from test;
line
line after en empty line

line after 2 empty line
line after 0 empty lines
SELECT REGEXP_REPLACE (col,CHR (10) || '{2,}', CHR (10) || CHR (10) ) FROM test;| 
line
line after en empty line
line after 2 empty line
line after 0 empty lines

db<>小提琴在这里

最新更新