s = 'hello'; # Ruby 1.8 s[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.9 s[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 # 將第一個字符替換爲大寫的H s[-1] = ?O # 將最後一個字符替換爲大寫的O s[s.length] = ?! # 這裏會出現異常,因爲你的賦值超出了索引的訪問
等號右邊可以是任意的字符串,多字節字符串也是允許的,或者是一個空的字符串,一下代碼在Ruby1.8和1.9都可以正常運行:
s = "hello" # 初始化字符串 s[-1] = "" # 刪除最後一個字符,現在s的值爲hell s[-1] = "p!" # 修改最後一個字符現在s的值爲 "help!"
大多數情況下,你需要取得的是字符串中的一段內容,而不是一個單獨的字符。要截取字符串中的一段內容你可以在[]中給出兩個用逗號隔開的數字,通過這種方式你就可以得到一段文本了。其中第一個數字指出了我們要截取的文本從哪個位置開始索引,第二個字符指出了我們要截取的內容的長度:
s = "hello" s[0,1] = "H" # 將第一個字符替換爲一個大寫的H s[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] # "": 這也是空的Range s[7..10] # nil: 這個Range超出了索引範圍,所以返回nil s[-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]/] = '*' # 將找到的第一個原音替換爲星號