🌊
正規表現 オンライン教材の応用編をJulia言語で解いた
http://www2.otani.ac.jp/fkdsemi/seikihyogen/mondai.html の応用編をJulia言語で解きました。
解答
module TestMatch
using Test
function main()
@testset "郵便番号への一致" begin
reg_exp = r"\d{3}-\d{4}"
@test match(reg_exp, "603") === nothing
@test match(reg_exp, "8143") === nothing
@test match(reg_exp, "603-8143").match == "603-8143"
@test match(reg_exp, "6038-413") === nothing
@test match(reg_exp, "6038143") === nothing
end
@testset "時間を求める1" begin
reg_exp = r"([0-1][0-9]|2[0-3]):[0-5][0-9]"
@test match(reg_exp, "00:05").match == "00:05"
@test match(reg_exp, "05:34").match == "05:34"
@test match(reg_exp, "12:71") === nothing
@test match(reg_exp, "19:11").match == "19:11"
@test match(reg_exp, "23") === nothing
@test match(reg_exp, "24:34") === nothing
@test match(reg_exp, "31:57") === nothing
@test match(reg_exp, "51:43") === nothing
end
@testset "日付への一致2" begin
reg_exp = r"200[0-9]年([1-9]|1[0-2])月([1-9]|[1-2][0-9]|3[0-1])日"
@test match(reg_exp, "1687年3月8日") === nothing
@test match(reg_exp, "1999年10月4日") === nothing
@test match(reg_exp, "2000年7月14日").match == "2000年7月14日"
@test match(reg_exp, "2001年3月6日").match == "2001年3月6日"
@test match(reg_exp, "2009年6月7日").match == "2009年6月7日"
@test match(reg_exp, "2009年12月31日").match == "2009年12月31日"
@test match(reg_exp, "2010年11月24日") === nothing
@test match(reg_exp, "2279年5月7日") === nothing
end
@testset "日付への一致3" begin
reg_exp = r"(19[0-9][0-9]|200[0-9])年([1-9]|1[0-2])月([1-9]|[1-2][0-9]|3[0-1])日"
@test match(reg_exp, "1687年3月8日") === nothing
@test match(reg_exp, "1899年12月31日") === nothing
@test match(reg_exp, "1900年1月1日").match == "1900年1月1日"
@test match(reg_exp, "1938年5月21日").match == "1938年5月21日"
@test match(reg_exp, "1999年10月4日").match == "1999年10月4日"
@test match(reg_exp, "2000年7月14日").match == "2000年7月14日"
@test match(reg_exp, "2001年3月6日").match == "2001年3月6日"
@test match(reg_exp, "2009年6月7日").match == "2009年6月7日"
@test match(reg_exp, "2009年12月31日").match == "2009年12月31日"
@test match(reg_exp, "2010年11月24日") === nothing
@test match(reg_exp, "2279年5月7日") === nothing
end
@testset "電話番号への一致" begin
reg_exp = r"075(-|\()\d{3}(-|\))\d{4}"
@test match(reg_exp, "075-432-3131").match == "075-432-3131"
@test match(reg_exp, "075-411-8123").match == "075-411-8123"
@test match(reg_exp, "077-578-6600") === nothing
@test match(reg_exp, "075(432)3131").match == "075(432)3131"
end
@testset "カタカナ語の伸ばし棒への一致" begin
reg_exp = r"\p{Katakana}+ー"
@test match(reg_exp, "サーバーやコンピューター、プリンター").match == "サーバー"
@test match(reg_exp, "マウス") === nothing
@test match(reg_exp, "モニタ") === nothing
end
@testset "置換 外来語語尾の”ー”を削除する" begin
reg_exp = r"ー$"
@test replace("コンピューター", reg_exp => "") == "コンピュータ"
@test replace("プリンター", reg_exp => "") == "プリンタ"
@test replace("シミュレーター", reg_exp => "") == "シミュレータ"
@test replace("テキストエディター", reg_exp => "") == "テキストエディタ"
end
@testset "ドル方式の通貨表記への一致" begin
reg_exp = r"\$\d+(\.\d+)?"
@test match(reg_exp, "125円") === nothing
@test match(reg_exp, "2,850円") === nothing
@test match(reg_exp, "12,049,305円") === nothing
# ERROR: LoadError: syntax: invalid interpolation syntax: "$2"、という例外が発生する。
# @test match(reg_exp, "$281.00").match == "$281.00"
end
@testset "ドル方式の通貨表記への一致" begin
reg_exp = r"\d{1,3}円|\d{1,3}(,\d{3})+円"
@test match(reg_exp, "125円").match == "125円"
@test match(reg_exp, "2,850円").match == "2,850円"
@test match(reg_exp, "12,049,305円").match == "12,049,305円"
# ERROR: LoadError: syntax: invalid interpolation syntax: "$2"、という例外が発生する。
# @test match(reg_exp, "$281.00") === nothing
# @test match(reg_exp, "$64.90") === nothing
# @test match(reg_exp, "$50") === nothing
# @test match(reg_exp, "$9") === nothing
# @test match(reg_exp, "$39820") === nothing
end
@testset "ディレクトリパスへの一致" begin
reg_exp = r"^.*\/"
@test match(reg_exp, "C:/program/python/line3.py").match == "C:/program/python/"
end
@testset "ファイル名への一致" begin
reg_exp = r"^.*\/"
# 分からなかった。。。
@test_skip match(reg_exp, "C:/program/python/line3.py").match == "line3.py"
end
end
end
if abspath(PROGRAM_FILE) == @__FILE__
using .TestMatch
TestMatch.main()
end
感想
正規表現が分かってきた感じがします。次は、パフォーマンスが悪化する場合について学習したいと思います。
Discussion