使用String#split方法在Ruby中拆分字符串
除非用戶輸入是單個單詞或數(shù)字,否則該輸入將需要拆分或轉(zhuǎn)換為字符串或數(shù)字列表。
例如,如果一個程序要求您的全名,包括中間首字母,它首先需要將該輸入分成三個單獨(dú)的字符串,然后才能與您的個人名字,中間名字和姓氏一起使用。這是使用String#split方法實現(xiàn)的。
String#split如何工作
在最基本的形式中,String#split采用單個參數(shù):字段分隔符作為字符串。將從輸出中刪除此分隔符,并返回在分隔符上拆分的字符串?dāng)?shù)組。
因此,在下面的示例中,假設(shè)用戶正確輸入他們的姓名,您應(yīng)該從拆分中收到一個三元素數(shù)組。
#!/usr/bin/env ruby
print"您的全名是什么?"
全名=gets.chomp
姓名=完整_name.split('')
放置"您的名字是#{姓名}"
放置"您的姓氏是#{名稱。最后}"
如果我們運(yùn)行此程序并輸入一個名稱,我們會得到一些預(yù)期的結(jié)果。另外,請注意姓名and名稱。最后是巧合。name變量將是數(shù)組,這兩個方法調(diào)用將等價于name[0]和name[-1]分別。
$紅寶石split.rb
你的全名是什么?Michael C.Morin
你的名字是Michael
你的姓氏是Morin
然而,String#split比你更聰明'd想。如果String#split的參數(shù)是一個字符串,它確實使用它作為分隔符,但如果參數(shù)是一個帶有單個空格的字符串(如我們所使用的),則它推斷您想要拆分任意數(shù)量的空白,并且您還想刪除任何領(lǐng)先的空白。
所以,如果我們給它一些稍微的錯誤ormed輸入,如
Michael C.Morin
(有額外的空格),那么String#split仍然可以做預(yù)期的事情。但是,當(dāng)您將字符串作為第一個參數(shù)時,這是**的特殊情況。正則表達(dá)式分隔符
你也可以通過一個正則表達(dá)式作為第一個參數(shù)。在這里,String#split變得更加靈活。我們也可以讓我們的小名拆分代碼更聰明。
我們不需要't想要中間初始末尾的時間段。我們知道它'是一個中間初始值,數(shù)據(jù)庫贏得了't想要一個周期,所以我們可以在拆分時刪除它。當(dāng)String#split與正則表達(dá)式匹配時,它會做同樣的事情,就像它剛剛匹配一個字符串分隔符一樣:它將它從輸出中取出并在此時分割它。
所以,我們可以稍微發(fā)展一下例子:
$貓split.rb
#!/usr/bin/env ruby
print"您的全名是什么?"
全名=gets.chomp
姓名=完整_name.split(/\.?\s+/)
放置"您的名字是#{姓名}"
放置"中間首字母為#{name[1]}"
放置"您的姓氏為#{名稱。最后}"
默認(rèn)記錄分隔符
Ruby在"特殊變量"您可能在Perl等語言中找到,但String#split確實使用了您需要注意的語言。這是默認(rèn)的記錄分隔符變量,也稱為$;。
它'是一個全局,你不常用'經(jīng)常在Ruby中看到,所以如果你改變它,它可能會影響代碼的其他部分,只需確保在完成后將其更改回來。
但是,所有這個變量都是第一個參數(shù)String#split的默認(rèn)值。默認(rèn)情況下,此變量似乎設(shè)置為nil。但是,如果String#split'、 第一個參數(shù)是nil,它將用單個空格字符串替換它。
零長度分隔符
如果傳遞給String#split的分隔符是零長度字符串或正則表達(dá)式,則String#split的行為會有所不同。它將從原始字符串中刪除任何內(nèi)容并拆分每個字符。這實質(zhì)上將字符串轉(zhuǎn)換為長度相等的數(shù)組,其中僅包含一個字符串,字符串中的每個字符一個。
這對于遍歷字符串非常有用,并且在pre-1.9.x和pre-1.8.7(從1.9.x反向移植了許多功能)中用于迭代字符串中的字符而不用擔(dān)心分解多字節(jié)Unicode字符。但是,如果您真正想要做的是迭代一個字符串,并且您'重新使用1.8.7或1.9.x,則可能應(yīng)該使用string#each#char。
#!/usr/bin/env ruby
str="她把我變成了一只蠑螈!"
str.split('')。每個do | c |
將c
end
限制返回數(shù)組的長度
那么回到我們的名稱解析示例,如果某人的姓氏有空格呢?例如,荷蘭姓氏通??梢砸?van"(意思是水果科普"of"or"from")開頭。
我們只需要一個3元素數(shù)組,所以我們可以使用第二個參數(shù)來String#split,這是我們迄今為止忽略的。第二個參數(shù)預(yù)計是Fixnum。如果這個參數(shù)是肯定的,那么最多很多元素將被填充到數(shù)組中。所以在我們的例子中,我們想通過3來論證這個論點(diǎn)。
#!/usr/bin/env ruby
print"您的全名是什么?"
全名=gets.chomp188>name=full_name.split(/\.?\s+/,3)
放置"您的名字是#{姓名}"
放置"您的中間首字母是#{name[1] }"
放置"您的姓氏是#{名稱。最后}"
如果我們再次運(yùn)行并給它一個荷蘭語名稱,它將按預(yù)期行事。
$紅寶石split.rb
你的全名是什么?Vincent Willem van Gogh 202你的名字是Vincent 203你的中間名字是Willem 204你的姓氏是van Gogh 205
但是,如果此參數(shù)為負(fù)數(shù)(任何負(fù)數(shù)),則對輸出數(shù)組中的元素數(shù)沒有限制,并且任何尾隨分隔符將在數(shù)組末尾顯示為零長度字符串。
這在IRB片段中得到了證明:
:001&>"這是a,測試,,,,,#34;.split(&\35; 39;,&\35; 39;,-1)
&#
>:001&"這是a,測試,,,,&35; 34;,這是a,測試,,,,,,&\35; 34;.split(&\?39;,&\35; 39;,-1)