🕌

初心者歓迎!手と目で覚える正規表現入門・その4(最終回)「中級者テクニックをマスターしよう」で、知識を補充した

2023/03/28に公開

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

ソースコード

module TestMatch
using Test

function main()
    @testset "単語境界に一致させる" begin
        reg_exp = r"\bhide\b"

        @test match(reg_exp, "hide hid hidden hiding hides").match == "hide"
    end

    @testset "「葵」の後に「祭」がある" begin
        reg_exp = r"葵(?=祭)" # 肯定の先読み

        @test match(reg_exp, "葵わかな 葵徳川三代 葵祭").match == "葵"
    end

    @testset "「葵」の後に「祭」がない" begin
        reg_exp = r"葵(?!祭)" # 否定の先読み

        @test match(reg_exp, "葵徳川三代 葵祭").match == "葵"
    end

    @testset "「ラーメン」の前に「塩」がある" begin
        reg_exp = r"(?<=塩)ラーメン" # 肯定の後読み

        @test match(reg_exp, "塩ラーメン 醤油ラーメン").match == "ラーメン"
    end

    @testset "「ラーメン」の前に「塩」がない" begin
        reg_exp = r"(?<!塩)ラーメン" # 否定の後読み

        @test match(reg_exp, "醤油ラーメン").match == "ラーメン"
    end

    @testset "キャプチャについて" begin
        @test match(r"(\d{2}):(\d{2}):(\d{2})", "09:02:46").captures == ["09", "02", "46"]
    end

    @testset "名前付きキャプチャについて" begin
        m = match(r"(?<hour>\d{2}):(?<minute>\d{2}):(?<second>\d{2})", "09:02:46")

        @test m[:hour] == "09"
        @test m[:minute] == "02"
        @test m[:second] == "46"
    end
end
end

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

    TestMatch.main()
end

感想

肯定の先読み、否定の先読み、肯定の後読み、否定の後読みなどなど知らなかったことが分かって良かったです。次回は、バックトラックでのパフォーマンス悪化について学習するつもりです。

Discussion