日常で使うRubyプログラミング

日常の作業でRubyを使う際、気になったことをChatGPTに聞いています。

Rubyの正規表現実践例

法令テキストから、Rubyの正規表現を用いて各条の表題を抽出し、

第一条:国内犯
第二条:すべての者の国外犯
・・

のように表示するプログラムです。

正規表現の威力がよく分かると思います。

注:蛇足ですが、scan() do .. end は、正規表現のグループにマッチした文字列を配列に格納して続くブロックに渡すメソッドなので、後方参照$nは使っていません

text = <<EOS
第一編 総則
第一章 通則
(国内犯)
第一条 この法律は、日本国内において罪を犯したすべての者に適用する。
(すべての者の国外犯)
第二条 この法律は、日本国外において次に掲げる罪を犯したすべての者に適用する。
(国民の国外犯)
第三条 この法律は、日本国外において次に掲げる罪を犯した日本国民に適用する。
(公務員の国外犯)
第四条 この法律は、日本国外において次に掲げる罪を犯した日本国の公務員に適用する。
(条約による国外犯)
第四条の二 第二条から前条までに規定するもののほか、この法律は、日本国外において、第二編の罪であって条約により日本国外において犯したときであっても罰すべきものとされているものを犯したすべての者に適用する。
(外国判決の効力)
第五条 外国において確定裁判を受けた者であっても、同一の行為について更に処罰することを妨げない。
(刑の変更)
第六条 犯罪後の法律によって刑の変更があったときは、その軽いものによる。
(定義)
第七条 この法律において「公務員」とは、国又は地方公共団体の職員その他法令により公務に従事する議員、委員その他の職員をいう。
(他の法令の罪に対する適用)
第八条 この編の規定は、他の法令の罪についても、適用する。
EOS

# 正規表現で条文の番号と括弧内の表題を抽出
text.scan(/([^]+)\n(.+?) /) do |m|
  puts "#{m[1]}#{m[0]}"
end

(出力)
第一条:国内犯
第二条:すべての者の国外犯
第三条:国民の国外犯
第四条:公務員の国外犯
第四条の二:条約による国外犯
第五条:外国判決の効力
第六条:刑の変更
第七条:定義
第八条:他の法令の罪に対する適用