文字列を 3 つのグループに分割しようとしていました。以下のコードで、結果にゴミが配列に含まれている理由を誰かが説明できることを願っています。
"1234567890".split(/(\d{3})/)
# => ["", "123", "", "456", "", "789", "0"]
グループを取得するにはスキャンを使用する方が良いことはわかっていますが、この特定の状況に興味がありました。
それはあなたのグループ化に関係しています、より単純なバージョンを比較してください:
"12:34:56:78:90".split(/(:)/)
=> ["12", ":", "34", ":", "56", ":", "78", ":", "90"]
"12:34:56:78:90".split(/:/)
=> ["12", "34", "56", "78", "90"]
通常、分割関数では、区切り文字は結果から除外されます。グループ化括弧により、結果に区切り文字が保持されます。グループがなければ、次のようになります。
"1234567890".split(/\d{3}/)
=> ["", "", "", "0"]
これは理にかなっていますが、最後の まで区切り文字の間には何もありません0
。次に、グループ化を追加すると、分割の通常の結果である「間に」区切り文字が散在します。空の文字列はスクラップではなく、数字のグループです。
そして最後に、ドキュメントを実際に見て、次のように読みました。
pattern が Regexp の場合、str はパターンが一致する場所で分割されます。パターンが長さ 0 の文字列と一致する場合は常に、str は個々の文字に分割されます。パターンにグループが含まれる場合、それぞれの一致も配列で返されます。