今回やる事
タイトル通り、正規表現で大文字から始まる文字列を取り出します。
コード
今回書いたコードは以下の通り
# 配列から大文字から始まる文字列を抜き出すメソッド
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"
想定通りの結果が出ました!今回の記事は以上です!