如何从sql中的**行格式文本中删除注释

时间:2015-04-03 09:31:23

标签: sql regex postgresql

Postgres 8.3+数据库文本列包含可能的多行表达式。

表达后,有空行和注释区域。 注释区域以行首开头的**字符开头。 表达式结尾只能有空行

实施例

1+
2
** this
is comment

使用追踪额外换行符:

1+
2

** this
is comment and newline after expression

如何从表达式中删除空行和注释? 表达式中的空行shoudl替换为空格。表达式末尾的空行和注释应该被删除。两种情况下结果都应为1+ 2。 如果只有注释,则应返回空字符串。

我尝试了下面的方法,但这并没有用空格替换表达式中的换行符。怎么解决?

CREATE OR REPLACE FUNCTION public.RemoveComment(value text) RETURNS text AS
$BODY$
select case when tulem like '**%' then ''
  else tulem end
from (  
SELECT trim(lower( Translate(   regexp_replace($1, E'\n\\*\\*.*', '', 'g'),E'\n\r', '')    )) as tulem
) tulem;

$BODY$ language sql immutable;

2 个答案:

答案 0 :(得分:1)

无法在Postgres 8.3中进行测试,这已经太老了,我再也无法使用了。但这应该有效 - 它在Postgres 9.3中有用。

SELECT regexp_replace($1, '[ \n]*\*\*.*$', '');

standard_conforming_strings = on!更多:

SQL Fiddle.

解释

[ \n\r] ..空格,换行符和回车符的字符类。您可能不需要\r,具体取决于您的字符串。
* ..任意数量或次数
\*\* ..两个字面星星
.* ..任何字符,任意数量的时间
$ ..字符串结尾

答案 1 :(得分:0)

如果要删除注释并用文本中的空格替换换行符,则应使用替换两次:

regexp_replace(regexp_replace($1, '((\n*)(\*\*.*)?)$', ''),'\n',' ')