'123 456 789'.scan(/\d+/) #=> ["123", "456", "789"]

# ----------------------------------------

'1977年7月17日 2021年12月31日'.scan(/(\d+)年(\d+)月(\d+)日/)
#=> [["1977", "7", "17"], ["2021", "12", "31"]]

# ----------------------------------------

'1977年7月17日 2021年12月31日'.scan(/(?:\d+)年(?:\d+)月(?:\d+)日/)
#=> ["1977年7月17日", "2021年12月31日"]

# ----------------------------------------

'1977年7月17日 2021年12月31日'.scan(/\d+年\d+月\d+日/)
#=> ["1977年7月17日", "2021年12月31日"]

# ----------------------------------------

text = '郵便番号は123-4567です'
text[/\d{3}-\d{4}/] #=> "123-4567"

# ----------------------------------------

text = '123-4567 456-7890'
text[/\d{3}-\d{4}/] #=> "123-4567"

# ----------------------------------------

text = '誕生日は1977年7月17日です'

# 第2引数がないとマッチした部分全体が返る
text[/(\d+)年(\d+)月(\d+)日/]    #=> "1977年7月17日"

# 第2引数を指定して3番目のキャプチャを取得する
text[/(\d+)年(\d+)月(\d+)日/, 3] #=> "17"

# ----------------------------------------

text = '誕生日は1977年7月17日です'

# シンボルでキャプチャの名前を指定する
text[/(?<year>\d+)年(?<month>\d+)月(?<day>\d+)日/, :day]  #=> "17"

# 文字列でキャプチャの名前を指定する
text[/(?<year>\d+)年(?<month>\d+)月(?<day>\d+)日/, 'day'] #=> "17"

# ----------------------------------------

text = '郵便番号は123-4567です'
text.slice(/\d{3}-\d{4}/)              #=> "123-4567"

text = '誕生日は1977年7月17日です'
text.slice(/(\d+)年(\d+)月(\d+)日/, 3) #=> "17"

# ----------------------------------------

text = '郵便番号は123-4567です'
text.slice!(/\d{3}-\d{4}/) #=> "123-4567"
text                       #=> "郵便番号はです"

# ----------------------------------------

text = '123,456-789'

# 文字列で区切り文字を指定する
text.split(',')   #=> ["123", "456-789"]

# 正規表現を使ってカンマまたはハイフンを区切り文字に指定する
text.split(/,|-/) #=> ["123", "456", "789"]

# ----------------------------------------

text = '123,456-789'

# 第1引数に文字列を渡すと、完全一致する文字列を第2引数で置き換える
text.gsub(',', ':')   #=> "123:456-789"

# 正規表現を渡すと、マッチした部分を第2引数で置き換える
text.gsub(/,|-/, ':') #=> "123:456:789"

# ----------------------------------------

text = '123,456-789'
# カンマはコロンに、ハイフンはスラッシュに置き換える
hash = { ',' => ':', '-' => '/' }
text.gsub(/,|-/, hash) #=> "123:456/789"


# ----------------------------------------

text = '123,456-789'
# カンマはコロンに、それ以外はスラッシュに置き換える
text.gsub(/,|-/) { |matched| matched == ',' ? ':' : '/' }
#=> "123:456/789"

# ----------------------------------------

text = '123,456-789'
text.gsub!(/,|-/, ':')
text #=> "123:456:789"

# ----------------------------------------

text = '誕生日は1977年7月17日です'
text.gsub(/(\d+)年(\d+)月(\d+)日/, '\1-\2-\3') #=> "誕生日は1977-7-17です"

# ----------------------------------------

# ダブルクオートで囲む場合は、\\1のようにバックスラッシュを2つ重ねる
text.gsub(/(\d+)年(\d+)月(\d+)日/, "\\1-\\2-\\3") #=> "誕生日は1977-7-17です"

# ----------------------------------------

# 第2引数の代わりにブロックを使うと、バックスラッシュをどうエスケープするか迷わずに済む
# キャプチャした文字列は$1や$2で参照でき、ブロックの戻り値が置き換え後の文字列になる
text.gsub(/(\d+)年(\d+)月(\d+)日/) do
  "#{$1}-#{$2}-#{$3}"
end
#=> "誕生日は1977-7-17です"

# ----------------------------------------

text = '誕生日は1977年7月17日です'
text.gsub(
  /(?<year>\d+)年(?<month>\d+)月(?<day>\d+)日/,
  '\k<year>-\k<month>-\k<day>'
)
#=> "誕生日は1977-7-17です"

# ----------------------------------------

text.gsub(/(?<year>\d+)年(?<month>\d+)月(?<day>\d+)日/) do
  "#{$~[:year]}-#{$~[:month]}-#{$~[:day]}"
end
#=> "誕生日は1977-7-17です"
