正規表現で大文字から始まる文字列を取り出す(Ruby)


今回やる事

タイトル通り、正規表現で大文字から始まる文字列を取り出します。

コード

今回書いたコードは以下の通り


# 配列から大文字から始まる文字列を抜き出すメソッド
def upperstr(array)

  # 配列の添字として使用する変数
  count = 0

  # 大文字から始まる文字列を格納する配列
  upper = []

  # eachメソッドで配列に含まれている要素を全て取り出す
  array.each{|arraystr|

    # 正規表現で先頭が大文字から始まりる文字列を抽出し、配列(upper)に格納する
    upper[count] = arraystr.slice(/^[A-Z].*/)

    # 配列の添字に1を加算する
    count += 1
  }

  # 文字列の先頭が小文字だった場合は配列にnilが格納されるため、deleteメソッドでnilを削除する。
  upper.delete(nil)

  # メソッドの返り値として、大文字から始まる文字列を格納した配列を変えす。
  return upper

end


# ユーザー用のガイド
p "文字列を半角スペースで区切って入力してください"

# コンソールから入力した文字列を変数に代入
str = gets

# 入力された文字列を半角スペースで区切って配列に代入
ary = str.split(" ")

# upperstrメソッドの返り値を変数に代入
# (upperstrメソッドは大文字から始まる文字列を取り出すメソッド)
upperary = upperstr(ary)

# ユーザー用のガイド
p "大文字から始まる文字列を取り出しました"

# eachメソッドで配列に含まれている要素を全て取り出す
upperary.each{|ustr|
  # 配列の中身を表示
  p ustr
}

正規表現

※各メソッドや処理についてはコメントに書いたので説明は割愛。
今回はupperstrメソッド内で使用しているsliceメソッドで正規表現を使っております。
噛み砕きまくって説明しますと、以下の通りです。

①コード
upper[count] = arraystr.slice(/^[A-Z].*/)

②/
/ と / で囲まれた範囲が正規表現パターンの範囲となる

③^
^の直後の文字が先頭の文字であることを表しています

④[A-Z]
AからZという意味であり、大文字であることを表しています。
^[A-Z] とすることで先頭が大文字である文字列を検索する事ができます。
小文字にしたい場合は[a-z]です。

⑤.
. は任意の1文字です。

⑥*
 は直前の文字列が0回以上繰り返すことを意味します。
.
 と書くことで、「任意の文字列が0回以上繰り返す」ということになります。
なんかわかりづらいと思いますが、「先頭の文字以外はどうでもいいよ」っていうことです。

動作確認

実際にプログラムを動かした結果を書いておきます。
入力値は「aaa AAA B b CC cc DDDDD ddddd」です。
大文字から始まる文字列を取り出すので、想定される結果は「AAA B CC DDDDD」となります。

% ruby regex.rb 
"文字列を半角スペースで区切って入力してください"
aaa AAA B b CC cc DDDDD ddddd
"大文字から始まる文字列を取り出しました"
"AAA"
"B"
"CC"
"DDDDD"

想定通りの結果が出ました!今回の記事は以上です!