介绍 PostgreSQL 替换函数,这些函数在字符串中搜索子字符串并将其替换为新的子字符串。
有时,您想搜索列中的字符串并将其替换为新字符串,例如替换过时的电话号码、损坏的 URL 和拼写错误。
要搜索字符串的所有匹配项并将其替换为新字符串,请使用 REPLACE() 函数。
下面说明了 PostgreSQL REPLACE() 函数的语法:
REPLACE(source, old_text, new_text );
REPLACE() 函数接受三个参数:
source 是一个你想要替换的字符串。
old_text 是您要搜索和替换的文本。 如果 old_text 在字符串中多次出现,它的所有出现都将被替换。
new_text 是将替换旧文本 (old_text) 的新文本。
请参阅以下使用“REPLACE()”函数的示例:
SELECT
REPLACE ('ABC AA', 'A', 'Z');
在此示例中,我们将字符串中的所有字符“A”替换为字符“Z”。
以下示例将 URL 中的子字符串“tt”替换为“xx”:
SELECT
REPLACE (
'https://www.zhaoxinsoft.com',
'tt',
'xx'
);
如果要搜索和替换表列中的子字符串,请使用以下语法:
UPDATE
table_name
SET
column_name = REPLACE(column,old_text,new_text)
WHEREcondition
如果您需要更高级的匹配方式,您可以使用REGEXP_REPLACE() 函数。
REGEXP_REPLACE() 函数允许您替换与正则表达式匹配的子字符串。 下面说明了REGEX_REPLACE() 函数的语法。
REGEXP_REPLACE(source, pattern, new_text [,flags])
REGEXP_REPLACE() 函数接受四个参数:
source 是您将查找与 pattern 匹配的子字符串并将其替换为 new_text 的字符串。 如果未找到匹配项,则源保持不变。
pattern 是一个正则表达式。 它可以是任何模式,例如:电子邮件、URL、电话号码等。
next_text 是替换子字符串的文本。
flags 包含零个或多个单字母标志,用于控制 REGEX_REPLACE() 函数的行为。 例如,i 表示不区分大小写匹配或忽略大小写。 g 代表全局; 如果使用 g 标志,该函数将替换所有匹配模式的子字符串出现。 flags 参数是可选的。
需要努力和实验才能理解REGEXP_REPLACE() 函数的工作原理。
以下是使用“REGEXP_REPLACE()”函数的示例。
SELECT
regexp_replace(
'foo bar foobar barfoo',
'foo',
'bar'
);
在下面的例子中,因为我们使用了 i 标志,它会忽略大小写并用 foo 替换第一次出现的 Bar 或 bar。
SELECT
regexp_replace(
'Bar foobar bar bars',
'Bar',
'foo',
'i'
);
在下面的例子中,我们使用了 g 标志,所有出现的 bar 都被替换为 foo。 请注意,Bar、BAR 或bAR 不会改变。
SELECT
regexp_replace(
'Bar sheepbar bar bars barsheep',
'bar',
'foo',
'g'
);
在下面的示例中,我们同时使用了 g 和 i 标志,因此所有出现的 bar 或 Bar、BAR 等都被替换为 foo。
SELECT
regexp_replace(
'Bar sheepbar bar bars barsheep',
'bar',
'foo',
'gi'
);
\m 表示只匹配每个单词的开头。 在任何情况下,所有以 bar 开头的单词都被 foo 替换。 以 bar 结尾的单词没有改变。
SELECT
regexp_replace(
'Bar sheepbar bar bars barsheep',
'\mbar',
'foo',
'gi'
);
\M 表示仅在每个单词的末尾匹配。 所有以“bar”结尾的单词都被 foo 代替。 以bar开头的词不会被替换。
SELECT
regexp_replace(
'Bar sheepbar bar bars barsheep',
'bar\M',
'foo',
'gi'
);
\m 和 \M 表示在每个单词的开头和结尾都匹配。 在任何情况下,所有以 bar 开头和结尾的单词都被替换为 foo。
SELECT
regexp_replace(
'Bar sheepbar bar bars barsheep',
'\mbar\M',
'foo',
'gi'
);
除了REPLACE() 和REGEXP_REPLACE() 函数,PostgreSQL 还提供了另一个名为TRANSLATE() 的函数用于字符串替换。
给定一个set字符,TRANSLATE()函数用new_set中的字符替换source字符串中匹配set的任何字符。
TRANSLATE(source, set, new_set);
The TRANSLATE() function accepts three parameters:
source 是您要搜索和替换的字符串。
set 是一组用于匹配的字符。
new_set 是一组字符,用于替换与 set 匹配的字符。
请注意,如果 set 的字符比 new_set 多,PostgreSQL 会从 source 字符串中删除 set 中多余的字符。
在以下示例中,我们将所有特殊元音转换为正常元音。
SELECTTRANSLATE (
'LÒ BÓ VÔ XÕ',
'ÒÓÔÕ',
'OOOO'
);
参考下图:
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio
我需要一个通过输入字符串进行计算的方法,像这样function="(a/b)*100"a=25b=50function.something>>50有什么方法吗? 最佳答案 您可以使用instance_eval:function="(a/b)*100"a=25.0b=50instance_evalfunction#=>50.0请注意,使用eval本质上是不安全的,尤其是当您使用外部输入时,因为它可能包含注入(inject)的恶意代码。另请注意,a设置为25.0而不是25,因为如果它是整数a/b将导致0(整数)。