2017-06-03 12 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+$/,'') 

ほとんど作品が、それは1つの致命的な欠陥を持っています。最後の単語を切り捨てる前に、の文字数で分割します。これは、を知る方法がないことを意味します。トリミングされているビットが全体の単語であっても部分的な単語であってもかまいません。

このため、コードは常に最後の単語を切り捨てます。

次のように私はこの問題を解決するだろう:

sentence[/\A.{0,39}[a-z]\b/mi] 
  • \Aは、文字列の先頭に正規表現を修正するためのアンカーです。
  • .{0,39}[a-z]は、1〜40文字で一致します。最後の文字は、の文字でなければなりません。これは、最後に選択した文字が句読点やスペースにならないようにするためです。あなたの質問は実際には指定されていません。[a-z]部分を自由に調整/削除してください。たとえば、[a-z.]は完全停止に合わせてください。
  • \bは単語境界のルックアラウンドです。これは単語の先頭と末尾にゼロ幅のマッチャーです。
  • /mi修飾子には、大文字と小文字を区別しない(つまりA-Z)と複数行一致が含まれます。

1つの非常にマイナーなノートでは、この正規表現は〜40文字(というよりも、ゼロ)と一致しているため、nullの結果を得ることが可能であるということです。 (これは一見すると非常に起こりにくいですが、1ワード、41+の文字列が必要なので!!)この場合を考慮に入れて、必要に応じて.to_sに電話してください。


更新:入力/結果の具体的な例を提供し、あなたの質問に改善された編集をいただき、ありがとうございます。元の投稿が多少あいまいだったので、これはあなたが求めているものをはるかに明確にします。

sentence.scan(/.{0,39}[a-z.!?,;](?:\b|$)/mi) 
  • String#scanは、パターンに一致する文字列の配列を返します - あなたは、元のを再構築するためにこれらの文字列を再参加することができます:

    は、次のようなもので、これを解決することができます。

  • もう一度、「サブストリングの最後の文字」のリストにさらにいくつかの文字(!?,;)を追加しました。必要に応じてこれを微調整してください。
  • (?:\b|$)は、「またはの末尾の単語境界」を意味します。これにより、部分文字列に最後の.が含まれない結果の問題が修正されます。 scanの結果が変更されないように、非キャプチャグループ(?:)を使用しています。
+0

あなたの助けを大変ありがとうが、それは私に初めての出現を返します。私の例は「確かに、東のドアが開けられたことを知ったときにだけ私たち自身を見せます」。 – Blueone

+0

トム、それはほとんど動作していますが、私は配列出力の最後のキャラクタを持っていません。私はドットを意味する。それは可能性があります。 | ! | ?アイデアはありますか?ありがとうございました。あなたの日を楽しんでください;-) – Blueone

+0

こんにちは@Blueone、私は今、私はキーボードに戻っている私の答えを更新しました。 –

関連する問題