経緯
あるシステムで、日付を含む文字列を取得してその日付を使って処理を行うという実装をしていた。
そんで、分割して取得した2つの日付を比較する。みたいなイメージ。
ちなみに日付の文字列は動的に変わっていく感じ。
元々の処理
period_str = '2016/4~2017/9'
# '2016/4~'
# '2016/4~2017/9'
period = period_str.split('~')
問題
これだと、正しく分割出来たり、出来ない問題が発生していた。
[10] pry(#xxxx)> period_str.split('~')
=> ["2016/3"]
[11] pry(#xxxx)> period_str.split('〜')
=> ["2016/3~"]
原因
原因はこのサイトが説明してくれていたよ↓
http://ch.nicovideo.jp/suwatoh/blomaga/ar634436
文字コードをこのサイトで↓
https://www.marbacka.net/msearch/tool.php#str2enc
[10]('~') --->\U0000FF5E
[11]('〜') ---> \U0000301C
まず浮かんだ対応策
あーね、全角チルダと波ダッシュで違う文字なのね。と。
じゃあその2パターンでsplitすれば良いやん!
こんなイメージ↓
period = period_str.split('~').split('〜')
いやいや、待てよ。もしその2パターン以外の文字(ちょっと思いつかないけど)で区切られてたらどうするよ!?
split('').split('')....ってイケてなさすぎでしょ。
最終的な解決策
ってことで、結局以下の方法に落ち着きました。
区切り文字部分を正規表現で取得して、そいつでsplitする
(2018/10/4 @kts_h からコメントを頂いたので追記)
# 元々の処理
separator = period_str[/[^0-9].*/][/.[^0-9]/][/[^0-9]/]
period = period_str.split(separator)
# 修正後の処理(こんな簡潔に済むとは...)
period = period_sty.split(/[^0-9\/]/)
p period # ["2016/4", "2017/9"]
正規表現について
あんまり得意じゃないので、実行しまくりながらたどり着きました。
str = '2016/4~2017/9'
first = str[/[^0-9].*/]
second = first[/.[^0-9]/]
last = second[/[^0-9]/]
p first # "/4~2017/9"
p second # "~2017/9"
p last # "〜"
separator = str[/[^0-9].*/][/.[^0-9]/][/[^0-9]/]
最後に
これまで気付かなかったってことは、途中で取得元のデータが変更になったのかな?
最初から出来ていなかったとしたら....結構恐ろしい...。
まぁ解決したので、とりあえず良しとしよう。