如何使用Ruby中的“split”方法


正如你所知道的,ruby字符串被稱為一流的對象,它使用了大量的查詢和操作方法。一個最基本的字符串操作是把一個字符串分割成多個子字符串。如果你有一個字符串,如“foo, bar, baz”而你希望的是這樣三個字符串“foo”,“bar”,“baz”。那么字符串類的split方法就可以幫助你。
“split”的基本用法
split方法的最基本用法分裂一個由單獨字符或字符的靜態序列組成的字符串。如果split的第一個變量是一個字符串,那么這個字符串中字符就會被當作一個字符串分隔符使用。但是在逗號分隔的數據中,逗號用來分隔數據,這里的每個字符串成分都被用來分隔數據。

#!/usr/bin/env ruby
str = "foo,bar,baz"
puts str.split(",")
$ ./1.rb

foo
bar
baz

通過正則表達式來增加靈活性
當然,還有一些更容易的方法可以分隔字符串。正則表達式可以為split方法增加靈活性。這里再次拿“foo, bar, baz”。間隔在第一個逗號之后而不是第二個逗號。如果該字符串“,”被當成是分隔符,那么在“baz”字符串的開始處仍然會存在間隔。如果使用“,”字符串,它只與第一個逗號匹配,因為第二個逗號后面沒有間隔。其作用還是有限的。
解決這個問題的辦法是把正則表達式作為定界符的自變量,而不是使用字符串。正則表達式不僅可以匹配靜態序列的字符,對字符的不定量和可選字符都同樣起作用。
編寫正則表達式
為你的分隔符編寫一個正則表達式,第一步就是描述清楚什么是分隔符。在這種情況下,一個逗號后面可能存在一個或多個空格是合理的。這一正則表達式庫中存在兩個要素:逗號和可選的間隔。間隔會使用* (星號)量詞,它表示的意思是“零或更多”。任何在它之前的要素都會匹配零次或若干次。例如,正則表達式/ a * /將匹配序列零或更多“a”字符。

#!/usr/bin/env ruby
str = "foo, bar,baz"
puts str.split( /, */ )
$ ./2.rb

foo
bar
baz

限制splits的數量
想象一個逗號分隔了這樣的字符串:“10,20,30,this is an arbitary string”。其格式是三個數字后面跟了一句評論。此評論可以包含任意的文本,包括帶有逗號的文本。要防止split分離文本這個文本,我們可以設置一個最大分裂列數。請注意,只有在任意文本的評論字符串處在表格最后一列時才管用。
為了限制splits的數量,字符串中數域的數量要作為split方法的第二個變量來發送。

#!/usr/bin/env ruby
str = "10,20,30,ten, twenty and thirty"
puts str.split( /, */, 4 )
$ ./3.rb

10
20
30
en, twenty and thirty

了解其局限性
分裂法有一些局限性。以字符串“10,20, ‘bob, eve and mallory’,30”為例。預期字符是兩個數字,后跟一個引證串(可能包含逗號),然后是另一個數字。split不能正確分隔這個字符串的域。為了做到正確分隔,需要保持字符串掃描器處於開啟狀態,這樣一來它就會記得它有沒有在引證串內部。反之,如果掃描儀不在啟動狀態,就不能解決這樣的問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM