正如你所知道的,ruby字串被稱為一流的對象,它使用了大量的查詢和操作方法。一個最基本的字串操作是把一個字串分割成多個子字串。如果你有一個字串,如“foo, bar, baz”而你希望的是這樣三個字串“foo”,“bar”,“baz”。那麼字串類的split方法就可以協助你。
“split”的基本用法
split方法的最基本用法分裂一個由單獨字元或字元的靜態序列組成的字串。如果split的第一個變數是一個字串,那麼這個字串中字元就會被當作一個字串分隔符號使用。但是在逗號分隔的資料中,逗號用來分隔資料,這裡的每個字串成分都被用來分隔資料。
#!/usr/bin/env rubystr = "foo,bar,baz"puts str.split(",")$ ./1.rbfoobarbaz
通過Regex來增加靈活性
當然,還有一些更容易的方法可以分隔字串。Regex可以為split方法增加靈活性。這裡再次拿“foo, bar, baz”。間隔在第一個逗號之後而不是第二個逗號。如果該字串“,”被當成是分隔字元,那麼在“baz”字串的開始處仍然會存在間隔。如果使用“,”字串,它只與第一個逗號匹配,因為第二個逗號後面沒有間隔。其作用還是有限的。
解決這個問題的辦法是把Regex作為定界符的自變數,而不是使用字串。Regex不僅可以匹配靜態序列的字元,對字元的不定量和可選字元都同樣起作用。
編寫Regex
為你的分隔字元編寫一個Regex,第一步就是描述清楚什麼是分隔字元。在這種情況下,一個逗號後面可能存在一個或多個空格是合理的。這一Regex庫中存在兩個要素:逗號和可選的間隔。間隔會使用* (星號)量詞,它表示的意思是“零或更多”。任何在它之前的要素都會匹配零次或若干次。例如,Regex/ a * /將匹配序列零或更多“a”字元。
#!/usr/bin/env rubystr = "foo, bar,baz"puts str.split( /, */ )$ ./2.rbfoobarbaz
限制splits的數量
想象一個逗號分隔了這樣的字串:“10,20,30,this is an arbitary string”。其格式是三個數字後面跟了一句評論。此評論可以包含任意的文本,包括帶有逗號的文本。要防止split分離文本這個文本,我們可以設定一個最大分裂列數。請注意,只有在任意文本的評論字串處在表格最後一列時才管用。
為了限制splits的數量,字串中數域的數量要作為split方法的第二個變數來發送。
#!/usr/bin/env rubystr = "10,20,30,ten, twenty and thirty"puts str.split( /, */, 4 )$ ./3.rb102030en, twenty and thirty
瞭解其局限性
分裂法有一些局限性。以字串“10,20, ‘bob, eve and mallory’,30”為例。預期字元是兩個數字,後跟一個引證串(可能包含逗號),然後是另一個數字。split不能正確分隔這個字串的域。為了做到正確分隔,需要保持字串掃描器處於開啟狀態,這樣一來它就會記得它有沒有在引證串內部。反之,如果掃描器不在啟動狀態,就不能解決這樣的問題。