🌊

正規表現 オンライン教材の応用編をJulia言語で解いた

2023/04/04に公開

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