整数有用的迭代器 3.times { print "X " } => X X X 1.upto(5) { |i| print i, " " } =>1 2 3 4 5 99.downto(95) { |i| print i, " " }=>99 98 97 96 9550.step(80, 5) { |i| print i, " " }=>50 55 60 65 70 75 80
二、字符串
Ruby的字符串是8位字节的简单序列,字符串是String类的对象
注意转换机制(注意单引号与双引号的区别),如: 单引号中两个相连的反斜线被替换成一个反斜线,,一个反斜线后跟一个单引号被替换成一个单引号 'escape using "\\"' >> 转义为"\" 'That\'s right' >> That's right
双引号支持多义的转义 "\n" #{expr}序列来替代任何的Ruby表达式的值 ,(全局变量、类变量或者实例变量,那么可以省略大括号) "Seconds/day: #{24*60*60}" >> Seconds/day: 86400 "#{'Ho! '*3}Merry Christmas" >> Ho! Ho! Ho! Merry Christmas "This is line #$." >> This is line 3
here document来创建一个字符串,end_of_string 为结束符号 aString = <<END_OF_STRINGThe body of the stringis the input lines up toone ending with the same text that followed the '<<'END_OF_STRING
%q和%Q分别把字符串分隔成单引号和双引号字符串(即%q与%Q后面的符号具有',"的功能) %q/general single-quoted string/ >> general single-quoted string
String 常用功能 String#split:把行分解成字段 String#chomp:去掉换行符 String#squeeze:剪除被重复输入的字符 String#scan:以指定想让块匹配的模式 exp: /jazz/j00132.mp3 | 3:45 | Fats Waller | Ain't Misbehavin' /jazz/j00319.mp3 | 2:58 | Louis Armstrong | Wonderful World #文件格式如上,要进行分解 songs = SongList.new songFile.each do |line| file, length, name, title = line.chomp.split(/\s*\|\s*/)#先chomp,后再分解,/\s*表示任字符 name.squeeze!(" ")#替换空格 mins, secs = length.scan(/\d+/)#这里用scan匹配模式 songs.append Song.new(title, name, mins.to_i*60+secs.to_i) end
用Regxp#match(aString)的形式或者匹配运算符=~(正匹配)和!~(负匹配)来匹配字符串了。匹配运算符在String和Regexp中都有定义,如果两个操作数都是字符串,则右边的那个要被转换成正则表达式 exp: a = "Fats Waller" a =~ /a/ >> 1 a =~ /z/ >> nil a =~ "ll" >> 7
上面返回的是匹配字符的位置,其它 $&接受被模式匹配到的字符串部分 $`接受匹配之前的字符串部分 $'接受之后的字符串。 exp:下面的方法后继都会用到 def showRE(a,re) if a =~ re "#{$`}<<#{$&}>>#{$'}" #返回前、中、后 else "no match" end end
字符类缩写 序列 形如 [ ... ] 含义 \d [0-9] Digit character \D [^0-9] Nondigit \s [\s\t\r\n\f] Whitespace character 匹配一个单空白符 \S [^\s\t\r\n\f] Nonwhitespace character \w [A-Za-z0-9_] Word character \W [^A-Za-z0-9_] Nonword character
重复 r * 匹配0个或多个r的出现 r + 匹配一个或多个r的出现 r ? 匹配0个或1个r的出现 r {m,n} 匹配最少m最多n个r的出现 r {m,} 匹配最少m个r的出现
重复结构有高优先权:即它们仅和模式中的直接正则表达式前驱捆绑 /ab+/匹配一个"a"后跟一个活着多个"b",而不是"ab"的序列 /a*/会匹配任何字符串:0个或者多个"a"的任意字符串。 exp: a = "The moon is made of cheese" showRE(a, /\w+/) >> <<The>> moon is made of cheese showRE(a, /\s.*\s/) >> The<< moon is made of >>cheese showRE(a, /\s.*?\s/) >> The<< moon >>is made of cheese showRE(a, /[aeiou]{2,99}/) >> The m<<oo>>n is made of cheese showRE(a, /mo?o/) >> The <<moo>>n is made of cheese
替换 "|"既匹配它前面的正则表达式或者匹配后面的 a = "red ball blue sky" showRE(a, /d|e/) >> r<<e>>d ball blue sky showRE(a, /al|lu/) >> red b<<al>>l blue sky showRE(a, /red ball|angry sky/) >> <<red ball>> blue sky
分组 圆括号把正则表达式分组,组中的内容被当作一个单独的正则表达式 showRE('banana', /(an)+/) >> b<<anan>>a # 匹配重复的字母 showRE('He said "Hello"', /(\w)\1/) >> He said "He<<ll>>o" # 匹配重复的子字符串 showRE('Mississippi', /(\w+)\1/) >> M<<ississ>>ippi
基于模式的替换 你是否想过,大小写替换。 方法String#sub和String#gsub都在字符串中搜索匹配第一个参数的部分,然后用第二个参数来替换它们。String#sub只替换一次,而String#gsub替换所有找到的匹配。都返回一个包含了替换的新的字符串的拷贝。进化版本是String#sub!和 String#gsub! a = "the quick brown fox" a.sub(/[aeiou]/, '*') >> "th* quick brown fox" a.gsub(/[aeiou]/, '*') >> "th* q**ck br*wn f*x" a.sub(/\s\S+/, '') >> "the brown fox" a.gsub(/\s\S+/, '') >> "the" 第二个参数可以是代码块 a = "the quick brown fox" a.sub (/^./) { $&.upcase } >> "The quick brown fox" a.gsub(/[aeiou]/) { $&.upcase } >> "thE qUIck brOwn fOx"