Upgrade to Pro — share decks privately, control downloads, hide ads and more …

「正規表現をつくる」をつくる / make "make regex"

「正規表現をつくる」をつくる / make "make regex"

YAPC::Fukuoka 2025での発表『「正規表現をつくる」をつくる』のスライドです。

Avatar for TSUYUSATO Kitsune

TSUYUSATO Kitsune

November 13, 2025
Tweet

More Decks by TSUYUSATO Kitsune

Other Decks in Programming

Transcript

  1. ౻࿘େ໻ (Hiroya Fujinami) ࣗݾ঺հ  w /** ࠃཱ৘ใֶݚڀॴ ͷത࢜՝ఔͷֶੜ w

    ઐ໳෼໺ਖ਼نදݱɾΦʔτϚτϯཧ࿦ w ࠷ۙ͸ɺΦʔτϚτϯֶश BVUPNBUBMFBSOJOH ΍ ໊໨ू߹ OPNJOBMTFU ʹؔ৺͕͋Δ w 3VCZίϛολᴷᴷ୅දతͳߩݙਖ਼نදݱͷϝϞԽʹΑΔߴ଎Խ w 4503&4ͱ͍͏ձࣾͰόΠτΛ͍ͯ͠Δ 3BJMTͰͷ8FC։ൃ 
  2. ৽ͨͳղܾࡦ ໰୊ͷ֬ೝ ϩʔυϚοϓ τʔΫͷྲྀΕ  1 3 ੜ੒"* --. ཧ࿦తͳํ๏

    1FSMͰ͸ ؆୯ͳղܾࡦ 2 ʮਖ਼نදݱΛॻ͘ʯ ϓϩάϥϜ͕ ཉ͍͠ ࡶͳ ࢓༷ ςετ έʔε ځ 2 ڀ
  3. ৽ͨͳղܾࡦ ໰୊ͷ֬ೝ ϩʔυϚοϓ τʔΫͷྲྀΕ  1 3 ੜ੒"* --. ཧ࿦తͳํ๏

    1FSMͰ͸ ؆୯ͳղܾࡦ Regexp::Assemble 2 ʮਖ਼نදݱΛॻ͘ʯ ϓϩάϥϜ͕ ཉ͍͠ ࡶͳ ࢓༷ ςετ έʔε ځ 2 ڀ
  4. ೳಈతΦʔτϚτϯֶश ཧ࿦తͳํ๏ w ςετέʔε͔Β༗ݶঢ়ଶΦʔτϚτϯΛߏங͢Δ໰୊Λ ʮೳಈతΦʔτϚτϯֶश QBTTJWFBVUPNBUBMFBSOJOH ʯͱݺͿ w ୅දతͳΞϧΰϦζϜ31/* 3FHVMBS1PTJUJWFBOE/FHBUJWF*OGFSFODF

     0ODJB(BSDÍB *OGFSSJOHSFHVMBSMBOHVBHFTJOQPMZOPNJOBMVQEBUFUJNF  111, 000, 11101, 01 0, 1, 00, 01 Ϛονͯ͠΄͍͠จࣈྻ Ϛονͯ͠΄͘͠ͳ͍จࣈྻ 0 0 0 1 1 1 (1ͷݸ਺-0ͷݸ਺)%3=0 
  5. 31/*ͷΞΠσΟΞ (2/4) ཧ࿦తͳํ๏ w ͭͷঢ়ଶΛϚʔδͯ͠Έͯɺ݁ՌͷΦʔτϚτϯ͕ ʮϚονͯ͠΄͘͠ͳ͍จࣈྻʯΛຬ͔ͨ͢ςετ  ε 1 1

    11 111 0 01 00 000 1110 11101 1 1 0 1 0 0 1 0 0, 1, 00, 01 Ϛονͯ͠΄͘͠ͳ͍ͷʹ Ϛονͯ͠͠·͏
  6. 31/*ͷΞΠσΟΞ (4/4) ཧ࿦తͳํ๏ w ʮ্ख͍ϚʔδʯΛ܁Γฦ͍ͯ͘͠ͱɺ໨తͷΦʔτϚτϯ͕ಘΒΕΔ  0, 1, 00, 01

    111, 000, 11101, 01 Ϛονͯ͠΄͍͠จࣈྻ Ϛονͯ͠΄͘͠ͳ͍จࣈྻ 0 0 0 1 1 1 (1ͷݸ਺-0ͷݸ਺)%3=0
  7. ΦʔτϚτϯͱਖ਼نදݱͷؔ܎ େֶͷߨٛͷ෮श w ʮΦʔτϚτϯͱਖ਼نදݱ͸૬ޓʹม׵Մೳʯ ,MFFOFʹΑΔ  w ͨͩ͠ɺΦʔτϚτϯΛ ਓ͕ؒಡΈ΍͍͢ਖ਼نදݱʹม׵͢Δ͜ͱ͸೉͍͠ 

    0 0 0 1 1 1 /\A(?:01|(?:1|00)(?:10)*(?:0|11)| (?:(?:01|(?:1|00)(?:10)*(?:0|11))?) (?:(?:(?:01|(?:1|00)(?:10)*(?:0| 11))?)*)(?:(?:01|(?:1|00) (?:10)*(?:0|11))?))?\z/ (1ͷݸ਺-0ͷݸ਺)%3=0 ಡΊͳ͍ɾϝϯςͰ͖Μ
  8. "*ʹཔͬͨͱ͖ͷ໰୊఺ (2/2) ੜ੒"* --. w 3F%P4 ਖ਼نදݱͷ੬ऑੑ ͷՄೳੑ͕͋Δ w ؔ࿈ݚڀ4JEEJRFUBM

    6OEFSTUBOEJOH3FHVMBS&YQSFTTJPO%FOJBMPG4FSWJDF 3F%P4  *OTJHIUTGSPN--.(FOFSBUFE3FHFYFTBOE%FWFMPQFS'PSVNT *$1$  /^\S+@\S+\.\S+$/ "@." x 2048 . "\n" ͷϚονʹඵ΋͔͔Δ    ⽘͘Β͍͕੬ऑ
  9. ࣮͸ཧ࿦͸ͦΜͳʹγϣϘ͘ͳ͍ w ਖ਼نදݱͷ߹੒ TZOUIFTJ[F ɾम෮ SFQBJS ͱ͍͏໰୊͕ ͱͯ΋׆ൃʹݚڀ͞Ε͍ͯΔ w ਖ਼نදݱͷ߹੒ɾम෮ςετέʔεΛຬͨ͢ਖ਼نදݱΛͭ͘Δ

    w ؔ࿈ݚڀ<1BOFUBM 0014-"> <-JFUBM "4&>  <-JFUBM 64&/*9> <$IJEB5FSBVDIJ 41>  <$IJEB5FSBVDIJ 1-%*> <4VOHFUBM > ʜʜ 
  10. ࣮͸ཧ࿦͸ͦΜͳʹγϣϘ͘ͳ͍ w ਖ਼نදݱͷ߹੒ TZOUIFTJ[F ɾम෮ SFQBJS ͱ͍͏໰୊͕ ͱͯ΋׆ൃʹݚڀ͞Ε͍ͯΔ w ਖ਼نදݱͷ߹੒ɾम෮ςετέʔεΛຬͨ͢ਖ਼نදݱΛͭ͘Δ

    w ؔ࿈ݚڀ<1BOFUBM 0014-"> <-JFUBM "4&>  <-JFUBM 64&/*9> <$IJEB5FSBVDIJ 41>  <$IJEB5FSBVDIJ 1-%*> <4VOHFUBM > ʜʜ 
  11. ਖ਼نදݱͷ߹੒ɾम෮ͷΞΠσΟΞ w ਖ਼نදݱͷςϯϓϨʔτΛ୳ࡧͰվྑ͍ͯ͘͠ w ਖ਼نදݱͷςϯϓϨʔτ͸ϋί˘ΛؚΉ ϋί˘͸ͲΜͳਖ਼نදݱͰ΋ೖΕΔ͜ͱ͕Ͱ͖Δ݀ ϓϨʔεϗϧμʔ  w ϋί˘ʹจࣈΫϥεΛೖΕͯ

    ςετέʔεΛຬ͔ͨ͢Ͳ͏͔ΛνΣοΫ͢Δ w μϝͳ৔߹ɺϋί˘Λ͞Βʹ۩ମతͳਖ਼نදݱͰஔ͖׵͑ͯ୳ࡧ  <$IJEB5FSBVDIJ 41> <$IJEB5FSBVDIJ 1-%*>
  12. ਖ਼نදݱͷ߹੒ɾम෮ͷྫ (1/7)  ab, cd, abab, ccdd ac, bc, ad,

    bd Ϛονͯ͠΄͍͠จࣈྻ Ϛονͯ͠΄͘͠ͳ͍จࣈྻ ୳ࡧΩϡʔ •/□/ ॳظঢ়ଶ
  13. ਖ਼نදݱͷ߹੒ɾम෮ͷྫ (2/7)  ab, cd, abab, ccdd ac, bc, ad,

    bd Ϛονͯ͠΄͍͠จࣈྻ Ϛονͯ͠΄͘͠ͳ͍จࣈྻ ୳ࡧΩϡʔ •/□/ ϋί˘ͭʹ จࣈΫϥεΛೖΕΔ͚ͩͰ ςετέʔεΛຬͨ͢ͷ͸ ϜϦ
  14. ਖ਼نදݱͷ߹੒ɾम෮ͷྫ (3/7)  ab, cd, abab, ccdd ac, bc, ad,

    bd Ϛονͯ͠΄͍͠จࣈྻ Ϛονͯ͠΄͘͠ͳ͍จࣈྻ ୳ࡧΩϡʔ •/□|□/ •/□□/ •/□*/ ϋί˘ΛΑΓ۩ମతͳ ਖ਼نදݱʹஔ͖׵͑ͯ ୳ࡧΩϡʔʹ௥Ճ
  15. ਖ਼نදݱͷ߹੒ɾम෮ͷྫ (4/7)  ab, cd, abab, ccdd ac, bc, ad,

    bd Ϛονͯ͠΄͍͠จࣈྻ Ϛονͯ͠΄͘͠ͳ͍จࣈྻ ୳ࡧΩϡʔ •/□|□/ •/□□/ •/□*/ /□|□/΋/□□/΋ จࣈΫϥεΛೖΕͯ ςετέʔεΛຬͨ͢ͷ͸ ϜϦ
  16. ਖ਼نදݱͷ߹੒ɾम෮ͷྫ (5/7)  ab, cd, abab, ccdd ac, bc, ad,

    bd Ϛονͯ͠΄͍͠จࣈྻ Ϛονͯ͠΄͘͠ͳ͍จࣈྻ ୳ࡧΩϡʔ •/□|□/ •/□□/ •/□*/ /[a-d]*/ͱ͢Δͱ Ұݟ͍͚ͦ͏͕ͩ Ϛονͯ͠΄͘͠ͳ͍ จࣈྻʹϚονͯ͠͠·͏
  17. ਖ਼نදݱͷ߹੒ɾम෮ͷྫ (6/7)  ab, cd, abab, ccdd ac, bc, ad,

    bd Ϛονͯ͠΄͍͠จࣈྻ Ϛονͯ͠΄͘͠ͳ͍จࣈྻ ୳ࡧΩϡʔ •/□*|□*/ •/□*□*/ •… ࠶౓ɺϋί˘Λ ۩ମతͳਖ਼نදݱʹ ஔ͖׵͑ͯ୳ࡧ
  18. ਖ਼نදݱͷ߹੒ɾम෮ͷྫ (7/7)  ab, cd, abab, ccdd ac, bc, ad,

    bd Ϛονͯ͠΄͍͠จࣈྻ Ϛονͯ͠΄͘͠ͳ͍จࣈྻ ୳ࡧΩϡʔ •/□*|□*/ •/□*□*/ •… /[ab]*|[cd]*/ͱ͢Δ ͜ͱͰ໨తͷਖ਼نදݱʹʂ
  19. ϋί˘ͷຒΊํ w ϋί˘ΛຒΊΔจࣈΫϥε͸4"5ιϧόΛ࢖ܾͬͯఆ͢Δ w ςετέʔεͰਖ਼نදݱϚονΛͯ͠ɺ ˘ʹ౰ͨͬͨΒ࿦ཧࣜΛ௥Ճ͢ΔΠϝʔδ  <$IJEB5FSBVDIJ 41> <$IJEB5FSBVDIJ

    1-%*> ˘ c˘  Ϛονͯ͠΄͍͠ ab (□1 = a ∧ □1 = b) ∨ (□2 = a ∧ □2 = b) Ϛονͯ͠΄͘͠ͳ͍ bc ¬(□1 = b ∧ □1 = c) ∧ ¬(□2 = b ∧ □2 = c)
  20. ৽ͨͳղܾࡦ ໰୊ͷ֬ೝ ϩʔυϚοϓ τʔΫͷྲྀΕ  1 3 ੜ੒"* --. ཧ࿦తͳํ๏

    1FSMͰ͸ ؆୯ͳղܾࡦ Regexp::Assemble RPNI ReDoSͳͲͷ໰୊ 2 ʮਖ਼نදݱΛॻ͘ʯ ϓϩάϥϜ͕ ཉ͍͠ ࡶͳ ࢓༷ ςετ έʔε ੜ੒AI (LLM) Ͱ ʮ࠷ॳͷਖ਼نදݱʯ Λੜ੒ ਖ਼نදݱͷम෮ ΞϧΰϦζϜ ځ 2 ڀ
  21. ࣮૷͕ؒʹ߹Θͳ͔ͬͨཧ༝ ݴ͍༁ w ਖ਼نදݱͷम෮ͷݚڀ <$IJEB5FSBVDIJ 41> <$IJEB5FSBVDIJ 1-%*> ͷ࣮૷ͷιʔείʔυ͕ެ։͞Ε͍ͯͳ͍ ࣮ݧΛ࠶ݱ͢ΔͨΊͷԾ૝؀ڥͷΠϝʔδ͚ͩ͋Δ

     w ݱ࣮ੈքͷਖ਼نදݱʹ࢖͑ΔͨΊͷύʔα΍จࣈΫϥεͷ࣮૷͕େม w ࠷ۙ๩͔ͬͨ͠ υΠπʹߦͬͨΓΠϯυʹߦͬͨΓ͍ͯͨ͠  IUUQTHJUIVCDPNTQPOTPSTNBLFOPXKVTU (JU)VCεϙϯαʔืूத
  22. ݱࡏͷਐḿঢ়گ w ༷ʑͳਖ਼نදݱ࣮૷ +BWB4DSJQU 1FSM 3VCZ 1ZUIPO /&5 ʹରԠͰ͖Δ ਖ਼نදݱͷύʔα͸Ͱ͖͍ͯΔ

    w จࣈΫϥεͳͲͷࡉ͔ͳڍಈ͕·࣮ͩ૷Ͱ͖͓ͯΒͣɺ म෮ΞϧΰϦζϜͷ࣮૷͕࢝ΊΒΕ͍ͯͳ͍ w म෮ΞϧΰϦζϜࣗମ͸ͦ͜·Ͱେม͡Όͳͦ͞͏