字符串截取和查询

来源:互联网 发布:c语言模块化编程视频 编辑:程序博客网 时间:2024/04/30 10:12
也许String对象最重要的操作就是通过[]下标访问操作了,你可以通过这种方式提取字符串内容或者更改字符串内容。在Ruby1.8中字符串被当作一个字节或者8位的字符码数组,你可以通过length或者size方法获得这个数组的长度,你通过在[]设置索引数字来设置或者得到那个位置的值:
s = 'hello';   # Ruby 1.8s[0]           # 返回值为104,第一个字母'h'的ASCII码s[s.length-1]  # 返回值为111,最后一个字母'o'的ASCII码s[-1]          # 返回值为111,你可以使用负数索引s[-2]          # 返回值为108,倒数第二个字母'l'的ASCII码s[-s.length]   # 104: 另一种访问第一个字符的方式s[s.length]    # nil: 如果超出索引范围就返回nil

注意的一点是,索引是正向从0开始的,如果你使用负数索引那么最后一个字母是从-1开始索引的。而且,在Ruby中如果你给出了一个超出索引范围的下标,Ruby不会抛出异常,而是返回一个nil。
在Ruby1.9中返回值为一个字符串,而不是字符的编码:
s = 'hello';   # Ruby 1.9s[0]           # 返回'h's[s.length-1]  # 返回'o's[-1]          # 返回'o's[-2]          # 返回'l's[-s.length]   # 返回'h's[s.length]    # nil:如果超出索引范围就返回nil

如果要修改字符串内容,只要给相应位置赋值就可以了,Ruby1.8中你可以使用字符编码或者字符串作为赋值内容,在Ruby1.9中你应该使用字符串:
s[0] = ?H        # 将第一个字符替换为大写的Hs[-1] = ?O       # 将最后一个字符替换为大写的Os[s.length] = ?! # 这里会出现异常,因为你的赋值超出了索引的访问

等号右边可以是任意的字符串,多字节字符串也是允许的,或者是一个空的字符串,一下代码在Ruby1.8和1.9都可以正常运行:
s = "hello"      # 初始化字符串s[-1] = ""       # 删除最后一个字符,现在s的值为hells[-1] = "p!"     # 修改最后一个字符现在s的值为 "help!"

大多数情况下,你需要取得的是字符串中的一段内容,而不是一个单独的字符。要截取字符串中的一段内容你可以在[]中给出两个用逗号隔开的数字,通过这种方式你就可以得到一段文本了。其中第一个数字指出了我们要截取的文本从哪个位置开始索引,第二个字符指出了我们要截取的内容的长度:
s = "hello"s[0,1] = "H"              # 将第一个字符替换为一个大写的Hs[s.length,0] = " world"  # 在字符我末尾增加其他的字符串s[5,0] = ","              # 在字符串中插入一个逗号s[5,6] = ""               # 通过给一段文本赋值空文本的方式来删除那段文本,现在s == "Hellod"

另一种截取或者插入、删除、修改字符串的方式是使用Range(范围)对象,Range对象通过两个数字之间插入两个联系的点号表示,比如1..3表示范围在1到3之间。
s = "hello"s[2..3]           # "ll": 位于索引2到3的字符s[-3..-1]         # "llo": 负数索引页可以使用s[0..0]           # "h": Range只包含一个字符s[0...0]          # "": 空的Range对象s[2..1]           # "": 这也是空的Ranges[7..10]          # nil: 这个Range超出了索引范围,所以返回nils[-2..-1] = "p!"     # 替换值,现在s=="help!"s[0...0] = "Please " # 在起始位置插入新值,现在s== "Please help!"s[6..10] = ""        # 删除值,现在s== "Please!"

注意的一点是,用逗号分隔的方式,分别指出了索引的开始位置和截取字符的长度,而使用Range对象是制定了一段索引的范围,两者是不同的。
另外,你还可以使用字符串作为索引,当你这样做的时候,你得到的是字符串中包含这个字符的第一个,如果查找不到你给出的字符,就返回一个nil对象:
Created with colorer-take5 library. Type 'ruby's = "hello"      while(s["l"])     # 循环判断是否包含字符 "l" s["l"] = "L";   # 将找到的字符从 "l" 替换为 "L"end               # 现在s=="heLLo"

最后要说的是,你还可以在[]中包含正则表达式,这样会得到一个符合正则表达式的内容:
s[/[aeiou]/] = '*'    # 将找到的第一个原音替换为星号
0 0
原创粉丝点击