如何在Ruby中使用字符串替换

拆分字符串只是操纵字符串数据的一种方式。您还可以进行替换以用另一个字符串替换字符串的一部分。例如,在一个示例字符串(foo,bar,baz)中,用"foo"with"boo"in将产生"boo,bar,baz。"您可以使用字符串类中的subgsub方法执行此操作和更多操作。

红宝石替代品的许多选择

替代方法有两个品种。sub方法是两者中最基本的方法,并且具有最少数量的惊喜。它只是用替换替换指定模式的**个实例。

sub仅替换**个实例,gsub方法使用替换替换替换模式的每个实例。此外,subgsub都具有sub!gsub!同行。请记住,以感叹号结尾的Ruby中的方法会改变变量,而不是返回修改后的副本。

搜索并替换

替换方法最基本的用法是用一个静态替换字符串替换一个静态搜索字符串。在上面的例子中,"foo"被替换为"boo。"这可以用于**次出现"foo"在字符串中使用sub方法或所有出现"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

灵活搜索

搜索静态字符串只能到目前为止。最终,您'将运行需要匹配具有可选组件的字符串或字符串子集的情况。当然,替换方法可以匹配正则表达式而不是静态字符串。这使它们更加灵活,几乎可以匹配您可以想到的任何文本。

这个例子更真实一些。想象一组逗号分隔值。这些值被馈送到您无法控制的制表程序(封闭源)。生成这些值的程序也是封闭源代码,但它输出一些格式错误的数据。有些字段在逗号后面有空格,这导致制表程序中断。

一种可能的解决方案是在两个程序之间编写一个红宝石程序来充当"胶水,"或过滤器。这个Ruby程序将解决数据格式中的任何问题,以便制表器可以完成其工作。要做到这一点,它'非常简单:用逗号替换逗号,后面跟着多个空格。

#!/usr/bin/env ruby
STDIN.each做| l |
l.gsub!(/,+/,",")
将l
结束

gsub$catdata.txt
10,20,30
12.8,10.4,11
gsub$catdata.txt|./2.rb
10,20,30
12.8,10.4,11

教育_1

灵活替换

现在想象一下这种情况。除了轻微的格式错误外,生成数据的程序还会以科学符号生成数字数据。制表程序不理解这一点,所以你必须替换它。显然,一个简单的gsub会在这里得到'因为每次更换都会更换。

幸运的是,替换方法可以阻止替换参数。每次找到搜索字符串时,与搜索字符串(或regex)匹配的文本都会传递到此块。块产生的值用作替换字符串。在这个例子中,科学符号形式的浮动点编号(例如1.232e4)被转换为小数点的正常编号。字符串转换为到Åf

数字06>,然后使用格式字符串格式化编号。

#!/usr/bin/env ruby
STDIN.each做| l |
l.gsub!( /-?\d+\.d+e-?\d+/)做| n |
"%.3f"%n.to Uf
end
l.gsub!(/,+/,",")
将l
结束

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

不熟悉正则表达式?

让's退后一步,看看那个正则表达式。它看起来神秘而复杂,但它非常简单。如果您'不熟悉正则表达式,它们可能非常神秘。但是,一旦您熟悉它们,它们就会成为描述文本的简单而自然的方法。有许多元素,其中一些元素有量词。

这里的主要元素是\ d字符类。这将匹配任何数字,字符0到9。量词+与digit character类一起使用,表示这些数字中的一个或多个应该连续匹配。您有三组数字,两组用a""另一组用字母"分隔;e"(用于指数)。

浮动的第二个元素是负字符,它使用""量词。这意味着这些元素中的"零或一"。因此,简而言之,数字或指数开头可能有也可能没有负号。

另外两个要素是(句点)字符和e字符。将所有这些结合起来,得到一个与科学形式的数字匹配的正则表达式(或一组匹配文本的规则)(例如12.34e56)。