プログラミング備忘録

プログラミングの学習状況をメモしています

26日目

今日の学習

正規表現

昨日から引き続き学習。

Ruby本の著者の方のQiitaを参考にしているが、恐ろしいほど分かりやすい。

置換

初心者歓迎!手と目で覚える正規表現入門・その2「微妙な違いを許容しつつ置換しよう」 - Qiita

文字クラス

  • .
    「任意の一文字」
  • \w
    メタ文字[a-zA-Z0-9_](半角英数字とアンダースコア1文字)である、「英単語を構成する文字」
  • [^]
    [ ]の最初に^が入ると、「^の後ろにくる文字以外の任意の文字」
    [^A]であれば、「A以外の任意の文字」となり、否定条件と呼ばれる

量指定子(文字量の指定)

  • ?
    「〜が1文字、または無し」
    [AB]?であれば、「AかBが一文字、または無し」 .?であれば、「任意の一文字、または無し」
  • +
    「直前の文字が1文字以上
  • *
    「直前の文字が0文字以上
  • 最小量指定子
    +?, *?のように、後ろに?をつけることで、最初に見つかった文字で終わるようになる
    最短のマッチを結果として返す

その他

  • エスケープ文字 \
    Rubyでは/ *** /のようにスラッシュを使って正規表現オブジェクトを作るので、
    正規表現の中に出てくるスラッシュ/エスケープ文字でエスケープする必要がある

  • ()でキャプチャをする
    正規表現()をつけると、その部分がキャプチャされて連番がつけられる。
    $1, $2...のような形でキャプチャした文字列を表せる。
    Rubyではキャプチャされた文字列を\1のような形で参照するようだ。

  • (?: )
    キャプチャする必要がない場合は、かっこの中に?:をつける

空白文字

初心者歓迎!手と目で覚える正規表現入門・その3「空白文字を自由自在に操ろう」 - Qiita

アンカー(位置を示すメタ文字)

  • ^
    「行頭」を表す
    ^.のようにすると、「行頭にくる任意の1文字」という意味

  • $
    「行末」を表す

文字クラス

  • \t
    「タブ文字」を表す

その他

  • OR条件
    |で条件を区切ることにより、「○○または□□」という条件を表す
空白に対して使える正規表現

^[ \t]+$で、「行頭から行末までに、スペースかタブ文字が1文字以上続く」という意味となり、空行に含まれている無駄なスペースやタブ文字を見つけることができる。

^[ \t]+で、「行頭からスペースかタブ文字が1文字以上続く」という意味になり、インデントで不揃いになっている文章を簡単に左寄せすることができる。

Ruby

Ruby正規表現

Rubyでは、正規表現をスラッシュで囲んで作成する。

/正規表現/

正規表現と文字列を比較する場合は=~を使う。マッチすれば真、しなければ偽が返ってくるため、if文に使用することができる。

!~を使うと、逆にマッチすれば偽、しなければ真が返ってくる。

rubular.com

このサイトで、Ruby正規表現のテストを簡単に行うことができる。

case文と複数条件

クイズプログラムをまだ直しているのだが、「答えがAでもBでも正解になるようにしたい」と思い、以下のような形で書いてみた。

guess = gets.chomp

case guess.downcase
        when question.answers[0] || question.answers[1]
          puts "正解です!"
(以下省略)

こんな感じで、||を使って「question.answers[0]またはquestion.answers[1]のときは正解」と書きたかった。

のだが、何度やってもquestion.answers[0]の答えしか正誤判定されない。[1]の回答を入れても不正解と言われてしまう。

原因がどこなのか色々考え、「そもそもcase文ではorを使えないのか?」とcase文に絞って検索したところ、自分の書き方が悪いことが分かった。

case文ではもちろん複数の条件を指定することができるのだが、

case ***
  when A, B
... ...

このように、AとBの間は||ではなく,で区切る必要があった。

[Ruby on Rails] 複数の条件で条件分岐したい時の書き方4種 - Qiita

こちらの記事を読んでやっと気づくことができた。

上のコードも、when question.answers[0] || question.answers[1]と書き換えることで無事に[1] の答えも受け付けてくれるようになった。

f:id:hasegawa_note:20210528235312p:plain

よかった!