40

次のようなテキストがあります。

content = "Do you like to code? How I love to code! I'm always coding." 

?または.またはのいずれかに分割しようとしています!

content.split(/[?.!]/)

結果を印刷すると、句読点の区切り文字がありません。

コードを書くのは好きですか

コーディングが好きな理由

いつもコーディングしています

どうすれば句読点を守れますか?

4

5 に答える 5

61

答え

?<=各文字列の末尾に区切り文字を保持するには、括弧キャプチャ グループ内で正の後読み正規表現 (つまり ) を使用します。

content.split(/(?<=[?.!])/)

# Returns an array with:
# ["Do you like to code?", " How I love to code!", " I'm always coding."]

これにより、2 番目と 3 番目の文字列の先頭に空白が残ります。\s*キャプチャ グループを除外するには、キャプチャ グループの後に 0 個以上の空白 ( ) の一致を追加します。

content.split(/(?<=[?.!])\s*/)

# Returns an array with:
# ["Do you like to code?", "How I love to code!", "I'm always coding."]

その他の注意事項

あなたの例では意味がありませんが、区切り文字は2番目の文字列から始まる文字列の前に移動できます。これは、正の先読み正規表現 (すなわち?=) で行われます。そのテクニックを探している人のために、その方法を次に示します。

content.split(/(?=[?.!])/)

# Returns an array with:
# ["Do you like to code", "? How I love to code", "! I'm always coding", "."]

動作を説明するためのより良い例は次のとおりです。

content = "- the - quick brown - fox jumps"
content.split(/(?=-)/)

# Returns an array with:
# ["- the ", "- quick brown ", "- fox jumps"]

区切り文字が 1 つしかないため、角かっこのキャプチャ グループは必要ないことに注意してください。また、最初の一致は最初の文字で発生するため、配列の最初の項目になります。

于 2013-08-06T20:18:23.583 に答える
19

質問のタイトルに答えるために、分割正規表現にキャプチャ グループを追加すると、分割区切り文字が保持されます。

"Do you like to code? How I love to code! I'm always coding.".split /([?!.])/
  => ["Do you like to code", "?", " How I love to code", "!", " I'm always coding", "."]

そこから、文を再構築するのは非常に簡単です (または、問題が必要とする場合は他のマッサージを行います)。

s.split(/([?!.])/).each_slice(2).map(&:join).map(&:strip)
 => ["Do you like to code?", "How I love to code!", "I'm always coding."]

ただし、他の回答で与えられた正規表現は、質問の本文をより簡潔に満たします。

于 2013-08-06T21:32:51.663 に答える
9

Use partition. An example from the documentation:

"hello".partition("l")         #=> ["he", "l", "lo"]
于 2015-04-11T23:01:14.537 に答える