2017-06-03 126 views
-5

我有一些字符串與一個句子,我需要將它細分爲最多40個字符的子字符串。 但我不想在一個詞的中間分割這個句子。Ruby:將字符串拆分爲最多40個字符的子字符串

我嘗試使用.gsub函數,但它最多返回40個字符,並避免在字中間切斷字符串。但這只是第一次出現而已。

sentence[0..40].gsub(/\s\w+$/,'') 

我試圖分裂,但我可以在一個單詞中間只選擇拳40個字符,分裂...

sentence.split(...){40} 

我的字符串是"Sure, we will show ourselves only when we know the east door has been opened."。 字符串輸出我要的是

["Sure, we will show ourselves only when we","know the east door has 
been opened."] 

你有一個解決方案?由於

+0

嘗試'句子[/ \ A. {0,40} \ b/m]' –

+1

你有句子的例子,輸出應該是什麼? –

+0

@WiktorStribiżew它僅返回第一個事件。 – Blueone

回答

2

你的第一次嘗試:

sentence[0..40].gsub(/\s\w+$/,'') 

幾乎的作品,但它有一個致命的缺陷。你在分割之前的字符數切斷了最後一個字。這意味着你有無法知道被修剪的位是一個完整的單詞還是一個部分單詞。

正因爲如此,您的密碼將會始終切斷的最後一個詞

如下我會解決這個問題:

sentence[/\A.{0,39}[a-z]\b/mi] 
  • \A是一個錨的正則表達式固定在字符串的開頭。
  • .{0,39}[a-z]匹配1到40個字符,其中最後一個字符必須是字母。這是爲了防止最後選擇的字符是標點符號或空格。 (是預期的行爲?你的問題並沒有真正說明。隨意調整/刪除[a-z]部分,例如[a-z.]匹配一個句號,如果需要的話。)
  • \b是一個字邊界環視。它是一個零寬度的匹配器,在單詞的開始/結尾處。
  • /mi修飾符將包括不區分大小寫(即A-Z)和多行匹配。

一個很輕微的注意的是,因爲這正則表達式是匹配 40個字符(而不是零),就可以得到一個空的結果。 (雖然這看起來不太可能,因爲你需要1個字,41個字母的字符串!!)爲了說明這個邊緣情況,如果需要,請致電.to_s


更新:謝謝你的改進編輯你的問題,提供輸入/結果的具體例子。這使得你所要求的更清晰,因爲原來的帖子有些模棱兩可。

你可以用類似下面的解決這個問題:

sentence.scan(/.{0,39}[a-z.!?,;](?:\b|$)/mi) 
  • String#scan返回該模式匹配的字符串陣列 - 這樣你就可以重新加入這些字符串來重構原始。
  • 再次,我添加了幾個字符(!?,;)到「子字符串中的最後字符」列表中。隨意根據需要調整它。
  • (?:\b|$)的意思是「字邊界,或行末」。這解決了在子字符串中不包括最終.的結果問題。請注意,我使用了非捕獲組(?:)以防止scan的結果發生變化。
+0

非常感謝您的幫助,但這只是第一次發生。我的例子是「當然,只有當我們知道東門已經打開時,我們纔會展示自己。」我想要這個字符串輸出:[「當然,我們只會顯示自己,當我們」,「知道東門被打開了。」] – Blueone

+0

湯姆,它幾乎工作,但我沒有在數組輸出中的最後一個字符。我的意思是點。這可能是。 | ! | ?你有好主意嗎 ?謝謝。享受你的一天;-) – Blueone

+0

嗨@Blueone,我已經更新了我的回答,現在我回到了鍵盤。 –

相關問題