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