🐈

正規表現入門決定版で、知識を補充した

2023/03/27に公開

https://qiita.com/nuco_bk/items/d48d763b205017f914ae の分からないところをざっと読んで、知識を補充しました。

ソースコード

module TestMatch
using Test

function main()
    @testset "0、1、2のいずれかのあとに、3がある場合" begin
        reg_exp = r"[012]3"

        @test match(reg_exp, "03").match == "03" 
        @test match(reg_exp, "13").match == "13"
        @test match(reg_exp, "23").match == "23"
        @test match(reg_exp, "33") === nothing
        @test match(reg_exp, "30") === nothing
    end

    @testset "0、1、2のいずれでもないあとに、3がある場合" begin
        reg_exp = r"[^012]3"

        @test match(reg_exp, "33").match == "33" 
        @test match(reg_exp, "43").match == "43"
        @test match(reg_exp, "03") === nothing
        @test match(reg_exp, "13") === nothing
        @test match(reg_exp, "23") === nothing
    end

    @testset "0埋め数字2桁の場合" begin
        reg_exp = r"^[0-9]{2}$"

        @test match(reg_exp, "02").match == "02" 
        @test match(reg_exp, "53").match == "53"
        @test match(reg_exp, "71").match == "71"
        @test match(reg_exp, "103") === nothing
        @test match(reg_exp, "7") === nothing
    end

    @testset "任意の3文字" begin
        reg_exp = r"^...$"

        @test match(reg_exp, "ながの").match == "ながの"
        @test match(reg_exp, "こうち").match == "こうち"
        @test match(reg_exp, "ぐん") === nothing
        @test match(reg_exp, "おかやま") === nothing
    end

    @testset "0回以上の繰り返し" begin
        reg_exp = r"a*"

        @test match(reg_exp, "").match == ""
        @test match(reg_exp, "a").match == "a"
        @test match(reg_exp, "aa").match == "aa"
    end

    @testset "1回以上の繰り返し" begin
        reg_exp = r"a+"

        @test match(reg_exp, "a").match == "a"
        @test match(reg_exp, "aa").match == "aa"
        @test match(reg_exp, "") === nothing
    end

    @testset "0回または1回以上の繰り返し" begin
        reg_exp = r"^a?$"

        @test match(reg_exp, "").match == ""
        @test match(reg_exp, "a").match == "a"
        @test match(reg_exp, "aa") === nothing
    end

    @testset "最大量指定子と最小量指定子" begin
        string = "「こんにちは」と「こんばんは」"

        @test match(r"「.*」", string).match == "「こんにちは」と「こんばんは」" # 何も指定しない場合、最大量指定子になる。
        @test match(r"「.*?」", string).match == "「こんにちは」" # ?をつけると最小量指定子になる。
    end
end
end

if abspath(PROGRAM_FILE) == @__FILE__
    using .TestMatch

    TestMatch.main()
end

感想

先週分からなかった最大量指定子と最小量指定子について、理解出来ました。先読みや名前付きキャプチャまで進めるか悩み中です。

Discussion