Rubyをメインに勉強中の初学者です。
自分用のアウトプットメモです。Qiitaの書き方も知りません(;ω;)
間違ってる箇所が多数あるかもしれませんg何卒ご了承ください。
正規表現と一緒に使えるメソッド、scanとかmatchとか色々あるけど、
私が今まであまり知らなかったやつ。メモしていくよ。
いくら探しても"月月火水木金金"に土日は存在しませんでした(;ω;)
前提
まず前提っ♪
正規表現オブジェクトは//
で囲まれてるよ。Regexpクラスのインスタンス。
/bb/.class #=> Regexp
生成方法は
# 単純に書くなら//で囲む
/bb/
# %記法で書くなら%rが正規表現オブジェクトにあたるよ。
%r(bb)
# あとはRegexpクラスのインスタンスやから、クラスメソッド経由でも作れるよ。
Regexp.new "bb"
とかいろいろ。
土曜日曜どこなん
A子さん、超ブラック企業に入っちゃいました。
オフィスの壁に「月月火水木金金」の文字。
ここは大日◯帝国か?私の知らない曜日が並んでる。
え、土と日の文字が無いんやけど気のせい??
目の前の現実を受け入れられないA子さん。正規表現で確認してみることにしたよ(???)
正規表現オブジェクトにおける===演算子
現実を知る前に、まずせめて華金があるのか知りたいA子さん。
正規表現オブジェクトに対して===
を使用すると正規表現が文字列にマッチするかtrueかfalseでわかるよ。===はどのクラスに対して使うかで意味が変わってくるんですな。
# 正規表現(Regexp)における===は「マッチするかどうか」
/金/ === "月月火水木金金"
# => true
# 逆に文字列(String)に対して===を使用するとfalseになる。
# これは===が「値が完全一致してるか」を確認する演算子になるからですね。
"月月火水木金金" === /金/
# => false
よかった。金曜はあるみたい。
週の終わりにも始まりにも日曜がないねんけど幻覚?確認してみるよ。
# $は末端を表す正規表現。^は先頭を表す正規表現
# つまり週の始めか終わりに日の文字があればtrueや!!
/^日|日$/ === "月月火水木金金"
# => false
え無いねんけど。土曜か日曜の文字が一つでもあればええんやけど
# []は指定されたいずれか一文字を表すよ。[土日]なら土か日の文字が一つでも存在すればtrueやね。
/[土日]/ === "月月火水木金金"
# => false
一つもないねんけど。
マッチする文字列を抜き出す。
現実を受け入れ始めたA子さん。
土曜と日曜がないのはわかったけど、もう涙で目の前の曜日が見えない。
正規表現で実態を確認してみましょう(??)
=~
メソッド
まず抜き出すよ〜っていう準備として=~
っていうクラスメソッド。
これ使うとマッチした時に文字列のどの位置からマッチしてるのかのインデックスが返ってくる。
「火」は月月火(012)、2の位置から始まってるから2と返ってくる感じ。
/火/ =~ "月月火水木金金"
#=> 2
位置が知りたいんやなくて、マッチした文字を抜き出したいんや〜って言う場合。
=~
を使用したときに$&
っていう組み込み変数に格納されるらしい。
/火/ =~ "月月火水木金金"
# =~と同一スコープ内で$&を確認すると?
p $&
#=> "火"
ちなみにマッチした部分より前の文字列は$`
に後ろの文字列は$'
に格納されるらしい。
/火/ =~ "月月火水木金金"
p $&. #=> "火"
p $` #=> "月月"
p $' #=> "水木金金"
火曜の前に「月月」??
何を言ってるんですか?
もう頭がパンクしてしまったA子さん。
締め!!
と、
そんなことはもうどうでもいいですね。それより$`
と$'
。前者がバッククォートで後者がシングルクォート。老眼でなくても違いがわからないですね。そもそもこれほとんど使う機会ないのでは?
シングルクォートとバッククォート。私もこれまで散々悩まされてきました。
この2つについて、ただひたすら怒りをぶちまけた2000字ほどの記事を昔Noteに書いたのを思い出しました。ご興味あればぜひ(´꒳`)