如何在Ruby中使用字符串替換
拆分字符串只是操縱字符串?dāng)?shù)據(jù)的一種方式。您還可以進行替換以用另一個字符串替換字符串的一部分。例如,在一個示例字符串(foo,bar,baz)中,用"foo"with"boo"in將產(chǎn)生"boo,bar,baz。"您可以使用字符串類中的sub和gsub方法執(zhí)行此操作和更多操作。
紅寶石替代品的許多選擇
替代方法有兩個品種。sub方法是兩者中最基本的方法,并且具有最少數(shù)量的驚喜。它只是用替換替換指定模式的第一個實例。
sub僅替換第一個實例,gsub方法使用替換替換替換模式的每個實例。此外,sub和gsub都具有sub!和gsub!同行。請記住,以感嘆號結(jié)尾的Ruby中的方法會改變變量,而不是返回修改后的副本。
搜索并替換
替換方法最基本的用法是用一個靜態(tài)替換字符串替換一個靜態(tài)搜索字符串。在上面的例子中,"foo"被替換為"boo。"這可以用于第一次出現(xiàn)"foo"在字符串中使用sub方法或所有出現(xiàn)"foo"使用gsub方法。
#!/usr/bin/env ruby
a="foo,bar,baz"
b=a.sub("foo","boo")
放置b
$./1.rb
foo,bar,baz
gsub$./1.rb
boo,bar,baz
靈活搜索
搜索靜態(tài)字符串只能到目前為止。最終,您'將運行需要匹配具有可選組件的字符串或字符串子集的情況。當(dāng)然,替換方法可以匹配正則表達(dá)式而不是靜態(tài)字符串。這使它們更加靈活,幾乎可以匹配您可以想到的任何文本。
這個例子更真實一些。想象一組逗號分隔值。這些值被饋送到您無法控制的制表程序(封閉源)。生成這些值的程序也是封閉源代碼,但它輸出一些格式錯誤的數(shù)據(jù)。有些字段在逗號后面有空格,這導(dǎo)致制表程序中斷。
一種可能的解決方案是在兩個程序之間編寫一個紅寶石程序來充當(dāng)"膠水,"或過濾器。這個Ruby程序?qū)⒔鉀Q數(shù)據(jù)格式中的任何問題,以便制表器可以完成其工作。要做到這一點,它'非常簡單:用逗號替換逗號,后面跟著多個空格。
#!/usr/bin/env ruby
STDIN.each做| l |
l.gsub?。?,+/,",")
將l
結(jié)束
gsub$catdata.txt
10,20,30
12.8,10.4,11
gsub$catdata.txt|./2.rb
10,20,30
12.8,10.4,11
靈活替換
現(xiàn)在想象一下這種情況。除了輕微的格式錯誤外,生成數(shù)據(jù)的程序還會以科學(xué)符號生成數(shù)字?jǐn)?shù)據(jù)。制表程序不理解這一點,所以你必須替換它。顯然,一個簡單的gsub會在這里得到'因為每次更換都會更換。
幸運的是,替換方法可以阻止替換參數(shù)。每次找到搜索字符串時,與搜索字符串(或regex)匹配的文本都會傳遞到此塊。塊產(chǎn)生的值用作替換字符串。在這個例子中,科學(xué)符號形式的浮動點編號(例如1.232e4)被轉(zhuǎn)換為小數(shù)點的正常編號。字符串轉(zhuǎn)換為到?f 數(shù)字06>,然后使用格式字符串格式化編號。 讓's退后一步,看看那個正則表達(dá)式。它看起來神秘而復(fù)雜,但它非常簡單。如果您'不熟悉正則表達(dá)式,它們可能非常神秘。但是,一旦您熟悉它們,它們就會成為描述文本的簡單而自然的方法。有許多元素,其中一些元素有量詞。 這里的主要元素是\ d字符類。這將匹配任何數(shù)字,字符0到9。量詞+與digit character類一起使用,表示這些數(shù)字中的一個或多個應(yīng)該連續(xù)匹配。您有三組數(shù)字,兩組用a"。"另一組用字母"分隔;e"(用于指數(shù))。 浮動的第二個元素是負(fù)字符,它使用"?"量詞。這意味著這些元素中的"零或一"。因此,簡而言之,數(shù)字或指數(shù)開頭可能有也可能沒有負(fù)號。 另外兩個要素是。(句點)字符和e字符。將所有這些結(jié)合起來,得到一個與科學(xué)形式的數(shù)字匹配的正則表達(dá)式(或一組匹配文本的規(guī)則)(例如12.34e56)。#!/usr/bin/env ruby
STDIN.each做| l |
l.gsub!( /-?\d+\.d+e-?\d+/)做| n |
"%.3f"%n.to Uf
end
l.gsub?。?,+/,",")
將l
結(jié)束gsub$catfloata.txt
2.215e-1,54,11
3.15668e6,21,7
gsub$catfloata.txt|./3.rb
0.222,54,11
3156680保健常識健德堂.000,21,7不熟悉正則表達(dá)式?