Rubyの正規表現について

Ruby正規表現の一部について覚書

例えば「大きな数値nをカンマ区切りで表示しなさい」という問題。

★条件

・N は自然数かつ、けた数が 3 の倍数
・N は 0 以上 10 ^ 1,000 以下("^"って"ハット/キャレット"っていう累乗の記号だったのか!初めて知った!)

★コード

n = gets.gsub(/(\d)(?=\d{3}+$)/, '\\1,')   # n = 123456789 => "123,456,789"

★解説

一つずつ解説します。

"gets" はユーザーからの入力を受け取るメソッド。つまり "n" 。 

"gsub"正規表現に基づく文字列の置換を行うメソッド。

 

そして正規表現についてです。

 

"/" から "/" (ここでは "/(\d)(?=\d{3}+$)/" まで)を正規表現にしていきます。

"\d" は1つの10進数の数字を表します。
"(   )" で()内の数字(ここでは "\d" )をキャプチャしています。

"?=" は、「肯定先読み」という表現で「ある位置から続く文字列(先読み、lookahead)とマッチする(肯定、positive)」であることを確認するものです。

"(?=\d{3}+$)" は、「次に続くのが3桁の数字で終わること」を確認しています。"\d" の後に続くのが3桁ずつで、最後はきっちり3桁で終わるようにしているわけです。

因みに、ここでの "$" は末尾を表しています。(ドルじゃないです)


そして、"\\1," は最初のキャプチャグループでキャプチャされた数字、つまり受け取った数字 "/(\d)(?=\d{3}+$)/""," で区切ることを指します。

 

一つひとつを覚えるのは大変ですね・・・。私も無理ですw

正規表現 (Ruby 3.2 リファレンスマニュアル)

も読み込むのはちょっときつい・・・。

今回はChatGTPや検索でこちらを参考にさせていただきました。

k-koh.hatenablog.com

 

プログラミング初心者のため、「これ間違ってるよ~!」などありましたらお知らせいただけると幸いです。

内定1社もらいました!

久々の更新ですが。

就活開始から約2週間・・・

 

1社内定いただきました!ありがとうございます!!!

ITエンジニアの人材派遣や受託開発を行う企業で、最初はリモートでの様々な研修を受けてから、派遣先のサポート業務(事務とか?)を経て、ゆくゆくはプログラマーとして開発業務に・・・!みたいな感じらしいです。

 

ただここは第3希望なので、第1希望と第2希望の結果次第かな。

ちなみに第1希望の技術試験は、勉強してる人なら簡単に解ける問題だったのに、面接官に見られながらコード書くのは緊張した・・・。(試験中ヒントもたくさんくれたのに)ダメダメで、「解答できたら一応メールでもGitHubでもいいから送ってね~」と言われました。

その後落ち着いて考えたらできたから送ったけど、大丈夫かしら💦

無事面接まで行けるといいけど💦

 

第2希望の社長(いきなり社長との対面面接!)はかなり良い方に巡り合えたと思いました!こちらの希望を聞いてくれるし、研修期間の給与面の心配していただいて。

ただ、今までスクールで学んだ言語とは違うから、本を読んでみて挑戦できそうならいつでも連絡してとのこと!そこで社長テストに合格できたら内定もらえるそうです!

頑張らないわけにはいかない!!!

本早く届かないかな~(しかも入社決まってないのに、「経費で落とすから領収書取っといて~」って言われました!さすが社長!世の社長てみんなこうじゃないよね!?)

 

なんにせよ今の仕事の引継ぎと就活とプログラミング頑張らねば!

そろそろ書き溜めたアウトプットも始めよう~

 

#プログラミング初心者 #就活

Ruby 繰り返し処理のプログラム作成

このブログは、プログラミング初心者がアウトプット用に始めたものです。

誤った解説などがありましたらコメントをお願いします。m(__)m

問題.1

ユーザーに数字を入力してもらい、その数の回数だけHello!と表示させるコードを記述してください。

雛形

1
2
3
4
5
6
def output()
end

puts "何回表示させますか?"

output()

↓↓↓解答
1
2
3
4
5
6
7
8
9
def output(num)
  num.times do
    puts "Hello!" 
  end
end

puts "何回表示させますか?"
num = gets.to_i
output(num)

解説

まず、表示させる回数numを変数とします。

numは数字として取得するためにgetsメソッドto_iソッドを使用します。

 

その後、取得した数字の分だけ繰り返すtimesメソッドを使用し、num回分処理を繰り返すようにします。

 

最後にoutputメソッドで処理回数分の表示を行います。

Ruby if,elseの使い方

このブログは、プログラミング初心者がアウトプット用に始めたものです。

誤った解説などがありましたらコメントをお願いします。m(__)m

 

問題

以下の要件を満たす in1to10メソッドを実装しましょう。

  • 第一引数のnumが1以上かつ10以下の範囲であればTrueを出力すること
  • 第二引数のoutside_modeがTrueの場合は、第一引数numが条件範囲外でもTrueを出力すること
  • それ以外はFalseを出力すること

雛形

1
2
3
4
5
6
7
8
def in1to10(num, outside_mode)
  # ここに条件式を記述する
end

# 呼び出し例
in1to10(5,false)
in1to10(11,false) 
in1to10(11,true) 

出力例

in1to10(5,false) →True
in1to10(11,false) →False
in1to10(11,true) →True

ヒント

 論理演算子

論理演算子とは、式の「真(True)」と「偽(False)」の確認や演算を行う際に用いられる演算子(記号、符号)のことです。以下のように条件分岐を実装する際、条件式に複数の条件を組み合わせるために用いられます。

1
2
3
if ( 【複数の条件が含まれる条件式】 )

end

複数の条件式を組み合わせた複雑な条件式を記述するために論理演算子&&||を使います。

条件式aと条件式bを組み合わせる場合は以下のように記述します。

1
2
3
4
5
# aもbもtrueの場合にtrue
a && b 

# aかbのどちらかがtrueの場合にtrue
a || b 

なおRubyの論理演算子では、左辺から右辺に条件式を評価します。もし式全体の評価が確定した場合は、その時点で残りの評価を行いません。

したがって、上の例で言えば、a&&bにおいてaがfalseの時点で全体がfalseと確定するため、bの判定は行いません。また、a||bでは、aがtrueの時点で全体がtrueと確定するため、bの判定は行いません。

↓↓↓

解答例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def in1to10(num, outside_mode)
  if (1 <= num && num <= 10) || outside_mode == true
    puts "True"
  else 
    puts "False"
  end
end

# 呼び出し例
in1to10(5,false)
in1to10(11,false) 
in1to10(11,true) 

まず、2行目では 1 <= num num <= 10 の二つの条件式が && で組み合わされています。

1 <= num がtrueであれば、その時点でtrueが返されますが、falseだった場合、処理は左辺から右辺へ順に評価されるため、この時点ではnumはfalseとなってしまいます。

 

ただし、その後 | | でさらに条件式 outside_mode == true (この "== true" は省略できます)が加わっているため、こちらが優先的に処理されます。

そのため、たとえ num が false であっても outside_mode が true であれば true が返されます。

 

では、呼び出し例を見てみます。

1
in1to10(5,false) →True

num=5はtrueですので、outside_modeがfalseであっても「true」となります。

1
in1to10(11,false) →False

num=11はfalseです。かつoutside_modeもfalseですので「false」となります。

1
in1to10(11,true) →True

num=11はfalseですが、outside_modeがtrueですので「true」となります。

 

Ruby eachの入れ子について

問題

以下のように、果物の名前と値段が入った配列があります。
この配列を用いて、果物の名前とそれぞれの合計額が出力される
コードを記述してください。

1
fruits_price = [["apple", [200, 250, 220]], ["orange", [100, 120, 80]], ["melon", [1200, 1500]]]
1
2
3
4
(出力)
appleの合計金額は670円です
orangeの合計金額は300円です
melonの合計金額は2700円ですししたt解答例

 

↓↓↓

解答例

1
2 3 4 5 6 7 8 9
fruits_price = [["apple", [200, 250, 220]], ["orange", [100, 120, 80]], ["melon", [1200, 1500]]]

fruits_price.each do |fruit|
  sum = 0
  fruit[1].each do |price|
    sum += price
  end
  puts "#{fruit[0]}の合計金額は#{sum}円です"
end

 

まず、3行目でfruits_price から ["apple", [200, 250, 220]] を取り出して変数 fruit に代入しappleの値段の合計を出すためのコードを記述します。sum に price を自己代入していくことで合計金額を出しています。

この処理を配列内すべてにeachで繰り返し、8行目で表示するようにしています。

 

Ruby  特定の文字列を検知するプログラム check_nameメソッド

check_nameメソッド

入力された名前に「.」や空白が含まれていないかを登録前に確認するメソッドです。

def check_name(str) 
  if str.include?(".")
    puts "!エラー!記号は登録できません"
  elsif str.include?(" ")
    puts "!エラー!空白は登録できません"
  else
    puts "登録が完了しました"
  end
end
puts "登録したい名前を入力してください(例)YamadaTaro"
str = gets
check_name(str) 

 

include?メソッドとは、指定した値が配列や文字内に含まれているかを判定するメソッドです。含まれていればtrue、含まれていなければfalseを返します。

 

まずはcheck_nameメソッドを定義します。

ここで仮引数をstrとし、空白があれば"!エラー!空白は登録できません"、ピリオドがあれば"!エラー!空白は登録できません"と表示されるようif文を使って記述します。

構文内では上から順に処理されるため、登録完了の表示は最後に記述します。

 

check_nameメソッドを定義したら、名前を入力するため"登録したい名前を入力してください(例)YamadaTaro"と表示させ、getsメソッドで入力された

文字列を取得します。

最後にcheck_nameメソッドを呼び出して完成です。

 

 

日々のあれこれと転職とプログラミング

シングルマザー、転職を決意する

令和5年5月、転職に向けて本格的にプログラミング勉強を始めました。

今の職場は明るい人が多いし、給料も安定してるんだけど、出張や残業、夜勤は当たり前でシングルマザーの私にはできないことが多すぎる。その分自分の業務+同僚不在間のカバーは避けられない。

給料減らしてでも業務を減らしてほしいって上司に話したことあるけど、それも無理。

かと言ってやりがいがある業務でもない。

 

ある日ふと「何のために働いてるんだっけ?」と考え始めてから、「私も子供ももっと楽しく過ごせる方法があるはず!今の職場にはない!」と思ってからは早かった。

ゆくゆくはリモートで仕事できるようITを基礎から学ぼうとITパスポートを受験(落ちたけどw)、それだけじゃ転職の武器にはならないからと同時並行でプログラミングスクールのオンライン講座を受講し始める。

今は昼は仕事、朝晩は家事育児勉強と忙しいけど、新しいことを始めた自分と協力してくれる子供に感謝しつつ、充実した日々を過ごしています。

その一環でブログでのアウトプットはやっていて損はないとのことで、ぼちぼち覚書として更新していきます。