次のようなテキストがあります。
content = "Do you like to code? How I love to code! I'm always coding."
?
または.
またはのいずれかに分割しようとしています!
。
content.split(/[?.!]/)
結果を印刷すると、句読点の区切り文字がありません。
コードを書くのは好きですか
コーディングが好きな理由
いつもコーディングしています
どうすれば句読点を守れますか?
次のようなテキストがあります。
content = "Do you like to code? How I love to code! I'm always coding."
?
または.
またはのいずれかに分割しようとしています!
。
content.split(/[?.!]/)
結果を印刷すると、句読点の区切り文字がありません。
コードを書くのは好きですか
コーディングが好きな理由
いつもコーディングしています
どうすれば句読点を守れますか?
答え
?<=
各文字列の末尾に区切り文字を保持するには、括弧キャプチャ グループ内で正の後読み正規表現 (つまり ) を使用します。
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 つしかないため、角かっこのキャプチャ グループは必要ないことに注意してください。また、最初の一致は最初の文字で発生するため、配列の最初の項目になります。
質問のタイトルに答えるために、分割正規表現にキャプチャ グループを追加すると、分割区切り文字が保持されます。
"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."]
ただし、他の回答で与えられた正規表現は、質問の本文をより簡潔に満たします。
Use partition
. An example from the documentation:
"hello".partition("l") #=> ["he", "l", "lo"]