字符串截取和查詢

也許String對象最重要的操作就是通過[]下標訪問操作了,你可以通過這種方式提取字符串內容或者更改字符串內容。在Ruby1.8中字符串被當作一個字節或者8位的字符碼數組,你可以通過length或者size方法獲得這個數組的長度,你通過在[]設置索引數字來設置或者得到那個位置的值:
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]/] = '*'
    # 將找到的第一個原音替換爲星號
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章