Обсуждение: Removing spaces
I have a field of type text that has a value like 'hello \nworld \n' I would like to remove the trailing blanks between the last character and the newline. I would like to use replace with a regx like /[ ]+\n/\n/ but it does not seem to work.
On Wednesday 19 Feb 2003 5:07 pm, Dave Smith wrote: > I have a field of type text that has a value like > > 'hello \nworld \n' > > I would like to remove the trailing blanks between the last character > and the newline. I would like to use replace with a regx like > /[ ]+\n/\n/ but it does not seem to work. The replace function doesn't handle regexps AFAIK - you could look at SUBSTRING() in the POSIX Regexp section of the functions reference but I don't think that's going to do it either. The problem is you seem to want to remove spaces after "hello" and "world" - I think that means you need perl regexps or a loop. Unless some posix guru steps forward, I'd say the easiest way is to build a loop that repeatedly calls replace(my_string,' \n','\n') -- Richard Huxton
Don't know if this is what you are looking for but the following will
remove them
select translate('hello \nworld \n',' ','');
HTH
Darren
On Wed, 19 Feb 2003, Richard Huxton wrote:
> On Wednesday 19 Feb 2003 5:07 pm, Dave Smith wrote:
> > I have a field of type text that has a value like
> >
> > 'hello \nworld \n'
> >
> > I would like to remove the trailing blanks between the last character
> > and the newline. I would like to use replace with a regx like
> > /[ ]+\n/\n/ but it does not seem to work.
>
> The replace function doesn't handle regexps AFAIK - you could look at
> SUBSTRING() in the POSIX Regexp section of the functions reference but I
> don't think that's going to do it either.
>
> The problem is you seem to want to remove spaces after "hello" and "world" - I
> think that means you need perl regexps or a loop.
>
> Unless some posix guru steps forward, I'd say the easiest way is to build a
> loop that repeatedly calls replace(my_string,' \n','\n')
>
--
Darren Ferguson
On Wednesday 19 Feb 2003 9:25 pm, Darren Ferguson wrote:
> Don't know if this is what you are looking for but the following will
> remove them
>
> select translate('hello \nworld \n',' ','');
But surely this will remove *all* spaces, wheras Dave seemed to want only
spaces before newline characters.
> > > I would like to remove the trailing blanks between the last character
> > > and the newline. I would like to use replace with a regx like
> > > /[ ]+\n/\n/ but it does not seem to work.
--
Richard Huxton
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
> I would like to remove the trailing blanks between the last character
> and the newline. I would like to use replace with a regx like
> /[ ]+\n/\n/ but it does not seem to work.
I do not believe you can do this in straight SQL, as the replace() function
does not use regular expressions. However, in perl and other regex-capable
languages, it is very simple:
$string =~ s/ +\n/\n/g;
If you need a way to do it within the database, here is a plpgsql function
I whipped up for the occasion:
CREATE OR REPLACE FUNCTION noendspace(text) RETURNS text LANGUAGE 'plpgsql' AS
'
DECLARE
oldtext ALIAS FOR $1;
newtext TEXT := \'\';
spaces INTEGER := 0;
mypos INTEGER := 1;
mychar TEXT;
BEGIN
LOOP
SELECT SUBSTRING(oldtext,mypos,1)
INTO mychar;
IF mychar = \' \' THEN
spaces := spaces + 1;
ELSE
IF mychar = \'\\n\' THEN
spaces := 0;
ELSE
WHILE spaces LOOP
newtext := newtext || \' \';
spaces := spaces - 1;
END LOOP;
END IF;
newtext := newtext || mychar;
END IF;
EXIT WHEN mychar = \'\';
mypos := mypos + 1;
END LOOP;
RETURN newtext;
END;
';
- --
Greg Sabino Mullane greg@turnstep.com
PGP Key: 0x14964AC8 200302201053
-----BEGIN PGP SIGNATURE-----
Comment: http://www.turnstep.com/pgp.html
iD8DBQE+VPtUvJuQZxSWSsgRAiDkAKDY7K0bg3itMZSh9bDaX5mFv/FqnwCgigTU
R6pvxOe8vpQNHDroRtMJjB4=
=TVWf
-----END PGP SIGNATURE-----