`
zarknight
  • 浏览: 146468 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Ruby way 第二章【字符串】3 -- 继续字符串

阅读更多
接上回的字符串的学习:

清除字符串两头的空白字符(包括空格,含行,tab)
================================================================
 使用strip和strip!可以清除字符串两头所有的空白字符:
str1 = "\t \nabc \t\n"
str2 = str1.strip         # "abc"
str3 = str1.strip!       # "abc"
# str1 is now "abc" also

如果我们只想清除字符串前面或后面的的空白字符呢?在早期一点的ruby版本中没有提供现成的方法,现在我们用的最新版本中都提供了现成方法:rstrip,lstrip(rstrip!,lstrip!)。早期的话,可以通过ruby中无处不在的正则表达式来实现:

现成版:
str1 = "\t  \nabc  \t\n"
str2 = str1.rstrip                            # "abc \t\n"
str3 = str1.lstrip                             #"\t    \nabc"

正则表达式版:
str1 = "\t  \nabc  \t\n"
str2 = str1.sub(/^\s*/,"") # "abc \t\n"
#下面这个去除尾部空白的方式比较奇怪吧?但是,就是这样的。
str3 = str2.reverse.sub(/^[ \t\n]*/,"").reverse #"\t    \nabc"



生成重复的字符串
================================================================
ruby中,乘号*被重载为可以用来重复字符串:
str = "hello!" * 3 # hello!hello!hello!



在字符串中嵌入表达式
================================================================
在双引号字符串中,可以嵌入用#{ }包含的表达式:
puts "#{ temp_f} Fahrenheit is #{ temp_c} Celsius"
puts "The discriminant has the value #{ b*b - 4*a*c} ."
puts "#{ word} is #{ word.reverse} spelled backward."

对于全局变量,类变量和实例变量,可以省略大括号:
print "$gvar = #$gvar and ivar = #@ivar."


处理 逗号分隔字符串 格式的数据
==================================================================
    逗号分隔字符串是一种计算机中常用的数据交换格式,在其他语言中,我们可能需要自己来编写处理这种数据
格式,来提取它的数据。
在ruby中,处理起来非常简单,用ruby的数组就可以简单实现:
string = gets.chop!
# 假如我们输入的是: "Doe, John", 35, 225, "5'10\"", "555-0123"
data = eval("[" + string + "]") # 转换成数组
data.each { |x| puts "VALUE = #{ x} "} # 轻松区分
结果:
Value = Doe, John
Value = 35
Value = 225
Value = 5' 10"
Value = 555-0123


把字符串转换成数字
====================================================================
我们可以使用to_f和to_i方法把字符串转化成数字形式:
num1 = "237".to_i # 237
num2 = "50 ways to leave...".to_i # 50
num3 = "You are number 6".to_i # 0
num4 = "no number here at all".to_i # 0

num5 = "3.1416".to_f # 3.1416
num6 = "0.6931 is ln 2".to_f # 0.6931
num7 = "ln 2 is 0.6931".to_f # 0.0
num8 = "nothing to see here".to_f # 0.0

注意,只有在字符串最前面的数字才能被ruby找到并转换,找不到的统统返回0.

转换成8进制和16进制的数字,可以使用oct和hex方法:
oct1 = "245".oct # 165
oct2 = "245 Days".oct # 165

# Leading zeroes are irrelevant.
oct3 = "0245".oct # 165
oct4 = "-123".oct # -83

# Non-octal digits cause a halt
oct4 = "23789".oct # 237

hex1 = "dead".hex # 57005

# Uppercase is irrelevant
hex2 = "BEEF".hex # 48879

# Non-hex letter/digit causes a halt
hex3 = "beefsteak".hex # 48879
hex4 = "0x212a".hex # 8490
hex5 = "unhexed".hex # 0

没有直接转换成2进制的方法,你可以自己写:),下面是一个实现,规则和hex,oct相同:

class String

def bin
val = self.strip
pattern = /^([+-]?)(0b)?([01]+)(.*)$/
parts = pattern.match(val)
return 0 if not parts
sign = parts[1]
num = parts[3]
eval(sign+"0b"+num)
end

end

a = "10011001".bin # 153
b = "0b10011001".bin # 153
c = "0B1001001".bin # 0
d = "nothing".bin # 0
e = "0b100121001".bin # 9


统计字符串中的字符
==================================================================
count方法:
s1 = "abracadabra"
a = s1.count("c") # 1
b = s1.count("bdr") # 5 (统计b,d,r的总数)

count方法的参数可以是简单的正则表达式:
c = s1.count("^a") # 6(不是字符a的字符数量)
d = s1.count("^bdr") # 6

e = s1.count("a-d") # 9(a到d之间的字符数量)
f = s1.count("^a-d") # 2


倒置字符串
===================================================================
可以使用reverse方法(reverse!)来倒置字符串:
s1 = "Star Trek"
s2 = s1.reverse # "kerT ratS"
s1.reverse!

如果有一个句子,你只想倒置其中单词顺序,而不每个字符,怎么做?这样做:
words = %w{ how now brown cow }
words.reverse.join(" ") # "cow brown now how"

或者是这样:
phrase = "Now here's a sentence"
phrase.split(" ").reverse.join(" ") # "sentence a here's Now"


删除连续重复的字符
===================================================================
使用squeeze方法:
s1 = "bookkeeper"
s2 = s1.squeeze # "bokeper"
s3 = "Hello..."
s4 = s3.squeeze # "Helo."

你可以指定需要删除的字符:
s1 = "bookkeeper"
s2 = s1.squeeze('e') # "bookeper"


删除字符串中指定的字符
====================================================================
使用delete方法(delete! ):
s1 = "To be, or not to be"
s2 = s1.delete("b") # "To e, or not to e"
s3 = "Veni, vidi, vici!"
s4 = s3.delete(",!") # "Veni vidi vici"


打印非打印字符
====================================================================
使用dump方法,可以让非打印字符可视:
puts "hello\t\n".dump #打印出hello\t\n,\t\n原样打印出来


生成Successive(不大好翻译)字符
====================================================================
有时候我们可能需要生成这样一串字符:"aaa","aab","aac",怎么做?可以用succ方法:
droid = "R2D2"
improved = droid.succ # "R2D3"

pill = "Vitamin B"
pill2 = pill.succ # "Vitamin C"

但是,并不推荐使用上面的方式来达到我们的目的,因为如果给出的字符串太奇怪深奥,则生成出来的结果可能根本不是
你要的。我们可以用upto方法来替代:

"Files, A".upto "Files, X" do |letter|
puts "Opening: #{ letter} "
end

不过,总的来说,做这样的实现还是存在一定风险的,不能保证100%正确,书的作者也说了,暂时还没有相对可靠的方法出现。




 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics