我想从电子邮件ID中删除元音。我应该使用哪种功能?
我想在postgresql中找到translate
和replace
之间的区别
但没有得到确切的差异
答案 0 :(得分:12)
translate()
将单个字符的 set 替换为(以字符串形式传递)另一个 set 字符(也作为字符串传递),例如:
translate('abcdef', 'ace', 'XYZ') --> 'XbYdZf'
replace()
用另一个字符串替换任意长度的字符串的出现次数:
replace('abcdef', 'bc', 'FOO') --> 'aFOOdef'
答案 1 :(得分:11)
在这种情况下,您可能actually want regexp_replace
。
假设“元音”是指“西欧(英语)语言元音字母”,你可以写一下:
SELECT regexp_replace('BobbafEtt@nerd.com', '[aeiou]', '', 'gi');
第四个参数中的gi
表示“将这个正则表达式 g 分别应用于整个输入字符串而不仅仅是第一个匹配,并使其成为案例 i nsensitive”。
请记住,w
和y
有时也会发音元音,具体取决于其背景。你将无法用正则表达式来处理它,所以它取决于你是否关心这个目的。
如果您正在使用电子邮件地址,则不太可能需要处理其他字符集,因此正则表达式可能适用于此。
在大多数情况下,使用正则表达式修改单词并不是一个好方法;例如,西里尔字母表中的俄语使用A Э У О Ы Я Е Ё Ю И
作为元音。另外,根据语言的不同,同一个脚本中的相同字母可能也可能不是元音! Keep reading here for more than you ever wanted to know
答案 2 :(得分:2)
要消除“电子邮件ID”中的所有元音,我想到的最简单的表达式是:
translate(email_id, 'aeiou', '')
为了补充波西米亚人的answer:
replace()
和translate()
均可用于:
两个函数都接受三个参数:
manipulated
:返回字符串将是该字符串的(可能是)修改版本from
字符串,其中包含在manipulated
字符串中找到的内容to
字符串,其中包含一些可能会出现在输出字符串中的内容,具体取决于所使用的功能,manipulated
字符串和from
字符串区别在于replace()
只能替换整个字符序列,必须按特定顺序在manipulated
字符串中找到这些字符:
postgres=> select replace('foobarbaz', 'bar', 'FRED');
replace
------------
fooFREDbaz
(1 row)
即使用空字符串替换它们:
postgres=> select replace('foobarbaz', 'bar', '');
replace
---------
foobaz
(1 row)
但是,如果无法在from
字符串内以特定顺序找到manipulated
字符串中的字符,则replace()
返回与manipulated
相同的字符串:< / p>
postgres=> select replace('foobarbaz', 'rab', '');
replace
---------
foobarbaz
(1 row)
另一方面, translate()
并不处理必须在要操作的字符串上以特定顺序找到的子字符串,而是处理字符的组:< / p>
manipulated
字符串中出现的from
字符串中的每个字符都映射到{在to
字符串中找到的{1}}字符串:
from
在上面的第一个postgres=> select translate('foobarbaz', 'bar', '123');
translate
-----------
foo12312z
postgres=> select translate('foobarbaz', 'rab', '123');
translate
-----------
foo32132z
(1 row)
示例中,发生了以下映射:
translate()
-> 'b'
(对于两次出现的'1'
)'b'
-> 'a'
(对于两次出现的'2'
)'a'
-> 'r'
(单次出现'3'
)尽管'3'
如上所述可以用于映射字符,但是也可以用于消除字符集。如果translate()
字符串短于to
字符串,则会发生这种情况:
from
在上面的第一个示例中,发生了以下映射:
postgres=> select translate('foobarbaz', 'rab', '1');
translate
-----------
foo1z
(1 row)
postgres=> select translate('foobarbaz', 'rab', '');
translate
-----------
fooz
(1 row)
-> 'r'
(对于'1'
的单次出现)'r'
->已消除(对于'b'
的两次出现)'b'
->已消除(对于'a'
的两次出现)在上述第二个示例中,由于'a'
字符串为空,因此消除了所有出现的字符'r'
,'a'
和'b'
。
因此,要消除电子邮件ID中的元音,您可以执行以下操作:
to
只要您关心的是translate(email_id, 'aeiou', '')
元音,就如Craig Ringer的answer所述。