2016-01-21 40 views
-1

我正在構建一個Ruby程序,它需要在字符串中的第二和第三個完全停止之間提取值。紅寶石:提取第二和第三完全停止之間的子串

我在網上搜索了各種相關的解決方案,包括截斷和以前的Stack-Overflow問題:Get value between 2nd and 3rd comma,但沒有答案說明了Ruby語言的解決方案。

在此先感謝。

+2

怎麼樣,發佈一個顯示問題的文件,並試圖解決它? – Friedrich

+0

這個問題似乎要麼*我們*爲您寫代碼,或者推薦一個網站或書籍,您可以從中複製代碼。這兩個都是關於SO的話題。 –

回答

4

這樣做我認爲。第一條命令將其分割成一個列表。第二個得到你想要的位

2

你可以拆分full stops(又名句點)上的字符串,但是爲每個子句串創建一個數組。如果文件有一百萬個這樣的子字符串,那麼獲得第三個字符串是一種相當低效的方式。

假設字符串爲:

mystring =<<_ 
Now is the time 
for all Rubiests 
to come to the 
aid of their 
bowling team. 
Or their frisbee 
team. Or their 
air guitar team. 
Or maybe something 
else... 
_ 

這裏有幾個你可以採取的辦法。

#1使用正則表達式

r =/
    (?:  # start a non-capture group 
     .*?\. # match any character any number of times, lazily, followed by a full stop 
    ){2}  # end non-capture group and perform operation twice 
    \K  # forget everything matched before 
    [^.]* # match everything up to the next full stop 
    /xm  # extended/free-spacing regex definition mode and multiline mode 

mystring[r] 
    #=> " Or their\nair guitar team" 

你當然可以寫正則表達式:

r = /(?:.*?\.){2}\K[^.]*/m 

,而是擴展的形式,使得它的自我記錄。

正則表達式引擎將遍歷字符串,直到找到匹配或者得出結論:不能匹配,並在那裏停止。

#2假裝一個句號是一個換行符

首先假設我們正在尋找第三條線,而不是第三子後跟一個句號。我們可以這樣寫:

mystring.each_line.take(3).last.chomp 
    # => "to come to the" 

Enumerable#take確定何時一行通過檢查輸入記錄分隔符,這是由global variable$/舉行結束。默認情況下,$/等於換行符。因此,我們可以這樣做:

irs = $/ # save old value, normally \n 
$/ = '.' 
mystring.each_line.take(3).last[0..-2] 
    #=> " Or their\nair guitar team" 

然後不留腳印:

$/ = irs 

這裏String#each_line返回一個枚舉(實際上是確定值序列的規則),而不是一個數組。

+0

OP的分隔符是一個句號,而不是一個換行符。 – Stefan

+0

順便說一句,什麼是F1賽事之外的「全速」? – mudasobwa

+0

@mudsie,一個時期。 –