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

ReDoS 検出の最先端 recheck の紹介 / State of the Art of ReDoS Detection

ReDoS 検出の最先端 recheck の紹介 / State of the Art of ReDoS Detection

TSUYUSATO Kitsune

March 04, 2022
Tweet

More Decks by TSUYUSATO Kitsune

Other Decks in Programming

Transcript

  1. 3F%P4ϠόΠɻ

    View full-size slide

  2. ·͡ͰϠόΠΑɺϚδϠόΠɻ

    View full-size slide

  3. ϠόΠɻӉ஦ϠόΠɻ·͡ͰϠόΠΑɺϚδϠόΠɻ

    Ӊ஦ϠόΠɻ

    ·ͣ޿͍ɻ΋͏޿͍ͳΜͯ΋Μ͡Όͳ͍ɻ௒޿͍ɻ

    ޿͍ͱ͔ͬͯ΋

    ʮ౦ژυʔϜݸͿΜ͘Β͍ʁʯ

    ͱ͔ɺ΋͏ɺͦ͏͍͏Ϩϕϧ͡Όͳ͍ɻ

    Կ͠ΖແݶɻεήΣʂͳΜ͔୯Ґͱ͔ແ͍ͷɻԿ௶ͱ͔Կᶨͱ͔Λ௒ӽͯ͠Δɻແݶͩ͠௒޿͍ɻ

    ͔͠΋๲ுͯ͠ΔΒ͍͠ɻϠόΠΑɺ๲ுͩΑɻ

    ͩͬͯී௨͸஍ٿͱ͔๲ு͠ͳ͍͡ΌΜɻͩͬͯࣗ෼ͷ෦԰ͷ࿓Լ͕ͩΜͩΜ৳ͼͯͬͨΒࠔΔ͡ΌΜɻτΠϨͱ͔௒ԕ͍ͱ͔ࠔΔ
    ͬ͠ΐɻ

    ௨ֶ࿏͕৳ͼͯɺҰ೥ͷͱ͖͸ెา෼ͩͬͨͷʹɺࡾ೥ͷͱ͖͸ࣗసंͰೋ࣌ؒͱ͔ٽͬ͘͠ΐɻ

    ͔ͩΒ஍ٿͱ͔๲ு͠ͳ͍ɻ࿩ͷΘ͔ΔϠπͩɻ

    ͚ͲӉ஦͸ϠόΠɻͦΜͳͷؾʹ͠ͳ͍ɻ๲ு͠·͘Γɻ࠷΋ԕ͔͘Β౸ୡ͢Δޫͱ͔؍ଌͯ͠΋Α͘Θ͔Μͳ͍͘Β͍ԕ͍ɻϠό
    ͗͢ɻ

    ແݶ͍͚ͬͯͨͲɺ΋͔ͨ͠͠Β༗ݶ͔΋͠Μͳ͍ɻͰ΋༗ݶͬͯࣄʹ͢Δͱ

    ʮ͡Ό͋ɺӉ஦ͷ୺ͷ֎ଆͬͯφχΑʁʯ

    ͬͯࣄʹͳΔ͠ɺͦΕ͸୭΋Θ͔Βͳ͍ɻϠόΠɻ୭ʹ΋෼͔Βͳ͍ͳΜͯੌ͗͢Δɻ

    ͋ͱ௒פ͍ɻ໿έϧϏϯɻઁࢯͰݴ͏ͱʵˆɻϠόΠɻפ͗͢ɻόφφͰఝଧͭՋ΋ͳ͘ࢮ͵ɻා͍ɻ

    ͦΕʹ௒Կ΋ແ͍ɻ௒ΨϥΨϥɻͦΕʹ௒ͷΜͼΓɻԯ೥ͱ͔ฏؾͰग़ͯ͘Δɻԯ೥ͯɻখֶੜͰ΋ݴΘͶ͐Αɺ࠷ۙɻ

    ͳΜͭͬͯ΋Ӊ஦͸അྗ͕ੌ͍ɻແݶͱ͔ฏؾͩ͠ɻ

    ͏ͪΒͳΜͯແݶͱ͔͔͔ͨͩੵ෼ܭࢉͰग़͖͚ͯͨͩͰ্ख͘ѻ͑ͳ͍͔Β༗ݶʹͨ͠ΓɺGͱஔ͍ͯΈͨΓɺԋࢉࢠ࢖ͬͨΓ͢
    ͷʹɺ

    Ӊ஦͸શવฏؾɻແݶΛແݶͷ··ѻͬͯΔɻੌ͍ɻϠόΠɻ

    ͱʹ͔͘و༷ΒɺӉ஦ͷϠό͞Λ΋ͬͱ஌Δ΂͖ͩͱࢥ͍·͢ɻ

    ͜ͷίϐϖΛɺ

    View full-size slide

  4. ϠόΠɻӉ஦ϠόΠɻ·͡ͰϠόΠΑɺϚδϠόΠɻ

    Ӊ஦ϠόΠɻ

    ·ͣ޿͍ɻ΋͏޿͍ͳΜͯ΋Μ͡Όͳ͍ɻ௒޿͍ɻ

    ޿͍ͱ͔ͬͯ΋

    ʮ౦ژυʔϜݸͿΜ͘Β͍ʁʯ

    ͱ͔ɺ΋͏ɺͦ͏͍͏Ϩϕϧ͡Όͳ͍ɻ

    Կ͠ΖແݶɻεήΣʂͳΜ͔୯Ґͱ͔ແ͍ͷɻԿ௶ͱ͔Կᶨͱ͔Λ௒ӽͯ͠Δɻແݶͩ͠௒޿͍ɻ

    ͔͠΋๲ுͯ͠ΔΒ͍͠ɻϠόΠΑɺ๲ுͩΑɻ

    ͩͬͯී௨͸஍ٿͱ͔๲ு͠ͳ͍͡ΌΜɻͩͬͯࣗ෼ͷ෦԰ͷ࿓Լ͕ͩΜͩΜ৳ͼͯͬͨΒࠔΔ͡ΌΜɻτΠϨͱ͔௒ԕ͍ͱ͔ࠔΔ
    ͬ͠ΐɻ

    ௨ֶ࿏͕৳ͼͯɺҰ೥ͷͱ͖͸ెา෼ͩͬͨͷʹɺࡾ೥ͷͱ͖͸ࣗసंͰೋ࣌ؒͱ͔ٽͬ͘͠ΐɻ

    ͔ͩΒ஍ٿͱ͔๲ு͠ͳ͍ɻ࿩ͷΘ͔ΔϠπͩɻ

    ͚ͲӉ஦͸ϠόΠɻͦΜͳͷؾʹ͠ͳ͍ɻ๲ு͠·͘Γɻ࠷΋ԕ͔͘Β౸ୡ͢Δޫͱ͔؍ଌͯ͠΋Α͘Θ͔Μͳ͍͘Β͍ԕ͍ɻϠό
    ͗͢ɻ

    ແݶ͍͚ͬͯͨͲɺ΋͔ͨ͠͠Β༗ݶ͔΋͠Μͳ͍ɻͰ΋༗ݶͬͯࣄʹ͢Δͱ

    ʮ͡Ό͋ɺӉ஦ͷ୺ͷ֎ଆͬͯφχΑʁʯ

    ͬͯࣄʹͳΔ͠ɺͦΕ͸୭΋Θ͔Βͳ͍ɻϠόΠɻ୭ʹ΋෼͔Βͳ͍ͳΜͯੌ͗͢Δɻ

    ͋ͱ௒פ͍ɻ໿έϧϏϯɻઁࢯͰݴ͏ͱʵˆɻϠόΠɻפ͗͢ɻόφφͰఝଧͭՋ΋ͳ͘ࢮ͵ɻා͍ɻ

    ͦΕʹ௒Կ΋ແ͍ɻ௒ΨϥΨϥɻͦΕʹ௒ͷΜͼΓɻԯ೥ͱ͔ฏؾͰग़ͯ͘Δɻԯ೥ͯɻখֶੜͰ΋ݴΘͶ͐Αɺ࠷ۙɻ

    ͳΜͭͬͯ΋Ӊ஦͸അྗ͕ੌ͍ɻແݶͱ͔ฏؾͩ͠ɻ

    ͏ͪΒͳΜͯແݶͱ͔͔͔ͨͩੵ෼ܭࢉͰग़͖͚ͯͨͩͰ্ख͘ѻ͑ͳ͍͔Β༗ݶʹͨ͠ΓɺGͱஔ͍ͯΈͨΓɺԋࢉࢠ࢖ͬͨΓ͢
    ͷʹɺ

    Ӊ஦͸શવฏؾɻແݶΛແݶͷ··ѻͬͯΔɻੌ͍ɻϠόΠɻ

    ͱʹ͔͘و༷ΒɺӉ஦ͷϠό͞Λ΋ͬͱ஌Δ΂͖ͩͱࢥ͍·͢ɻ

    ͜ͷਖ਼نදݱͰϚονϯά͢Δͱɺ
    /^.+(Ӊ஦|ϠόΠ|[\s\S])*.+$/

    View full-size slide

  5. ϠόΠɻӉ஦ϠόΠɻ·͡ͰϠόΠΑɺϚδϠόΠɻ

    Ӊ஦ϠόΠɻ

    ·ͣ޿͍ɻ΋͏޿͍ͳΜͯ΋Μ͡Όͳ͍ɻ௒޿͍ɻ

    ޿͍ͱ͔ͬͯ΋

    ʮ౦ژυʔϜݸͿΜ͘Β͍ʁʯ

    ͱ͔ɺ΋͏ɺͦ͏͍͏Ϩϕϧ͡Όͳ͍ɻ

    Կ͠ΖແݶɻεήΣʂͳΜ͔୯Ґͱ͔ແ͍ͷɻԿ௶ͱ͔Կᶨͱ͔Λ௒ӽͯ͠Δɻແݶͩ͠௒޿͍ɻ

    ͔͠΋๲ுͯ͠ΔΒ͍͠ɻϠόΠΑɺ๲ுͩΑɻ

    ͩͬͯී௨͸஍ٿͱ͔๲ு͠ͳ͍͡ΌΜɻͩͬͯࣗ෼ͷ෦԰ͷ࿓Լ͕ͩΜͩΜ৳ͼͯͬͨΒࠔΔ͡ΌΜɻτΠϨͱ͔௒ԕ͍ͱ͔ࠔΔ
    ͬ͠ΐɻ

    ௨ֶ࿏͕৳ͼͯɺҰ೥ͷͱ͖͸ెา෼ͩͬͨͷʹɺࡾ೥ͷͱ͖͸ࣗసंͰೋ࣌ؒͱ͔ٽͬ͘͠ΐɻ

    ͔ͩΒ஍ٿͱ͔๲ு͠ͳ͍ɻ࿩ͷΘ͔ΔϠπͩɻ

    ͚ͲӉ஦͸ϠόΠɻͦΜͳͷؾʹ͠ͳ͍ɻ๲ு͠·͘Γɻ࠷΋ԕ͔͘Β౸ୡ͢Δޫͱ͔؍ଌͯ͠΋Α͘Θ͔Μͳ͍͘Β͍ԕ͍ɻϠό
    ͗͢ɻ

    ແݶ͍͚ͬͯͨͲɺ΋͔ͨ͠͠Β༗ݶ͔΋͠Μͳ͍ɻͰ΋༗ݶͬͯࣄʹ͢Δͱ

    ʮ͡Ό͋ɺӉ஦ͷ୺ͷ֎ଆͬͯφχΑʁʯ

    ͬͯࣄʹͳΔ͠ɺͦΕ͸୭΋Θ͔Βͳ͍ɻϠόΠɻ୭ʹ΋෼͔Βͳ͍ͳΜͯੌ͗͢Δɻ

    ͋ͱ௒פ͍ɻ໿έϧϏϯɻઁࢯͰݴ͏ͱʵˆɻϠόΠɻפ͗͢ɻόφφͰఝଧͭՋ΋ͳ͘ࢮ͵ɻා͍ɻ

    ͦΕʹ௒Կ΋ແ͍ɻ௒ΨϥΨϥɻͦΕʹ௒ͷΜͼΓɻԯ೥ͱ͔ฏؾͰग़ͯ͘Δɻԯ೥ͯɻখֶੜͰ΋ݴΘͶ͐Αɺ࠷ۙɻ

    ͳΜͭͬͯ΋Ӊ஦͸അྗ͕ੌ͍ɻແݶͱ͔ฏؾͩ͠ɻ

    ͏ͪΒͳΜͯແݶͱ͔͔͔ͨͩੵ෼ܭࢉͰग़͖͚ͯͨͩͰ্ख͘ѻ͑ͳ͍͔Β༗ݶʹͨ͠ΓɺGͱஔ͍ͯΈͨΓɺԋࢉࢠ࢖ͬͨΓ͢
    ͷʹɺ

    Ӊ஦͸શવฏؾɻແݶΛແݶͷ··ѻͬͯΔɻੌ͍ɻϠόΠɻ

    ͱʹ͔͘و༷ΒɺӉ஦ͷϠό͞Λ΋ͬͱ஌Δ΂͖ͩͱࢥ͍·͢ɻ

    /^.+(Ӊ஦|ϠόΠ|[\s\S])*.+$/
    ໿ඵ͔͔Δɻ
    ˞.BD#PPL1SP J
    ্Ͱ/PEF KTͰ࣮ߦͨ݁͠Ռ

    View full-size slide

  6. ϠόΠɻӉ஦ϠόΠɻ·͡ͰϠόΠΑɺϚδϠόΠɻ

    Ӊ஦ϠόΠɻ

    ·ͣ޿͍ɻ΋͏޿͍ͳΜͯ΋Μ͡Όͳ͍ɻ௒޿͍ɻ

    ޿͍ͱ͔ͬͯ΋

    ʮ౦ژυʔϜݸͿΜ͘Β͍ʁʯ

    ͱ͔ɺ΋͏ɺͦ͏͍͏Ϩϕϧ͡Όͳ͍ɻ

    Կ͠ΖແݶɻεήΣʂͳΜ͔୯Ґͱ͔ແ͍ͷɻԿ௶ͱ͔Կᶨͱ͔Λ௒ӽͯ͠Δɻແݶͩ͠௒޿͍ɻ

    ͔͠΋๲ுͯ͠ΔΒ͍͠ɻϠόΠΑɺ๲ுͩΑɻ

    ͩͬͯී௨͸஍ٿͱ͔๲ு͠ͳ͍͡ΌΜɻͩͬͯࣗ෼ͷ෦԰ͷ࿓Լ͕ͩΜͩΜ৳ͼͯͬͨΒࠔΔ͡ΌΜɻτΠϨͱ͔௒ԕ͍ͱ͔ࠔΔ
    ͬ͠ΐɻ

    ௨ֶ࿏͕৳ͼͯɺҰ೥ͷͱ͖͸ెา෼ͩͬͨͷʹɺࡾ೥ͷͱ͖͸ࣗసंͰೋ࣌ؒͱ͔ٽͬ͘͠ΐɻ

    ͔ͩΒ஍ٿͱ͔๲ு͠ͳ͍ɻ࿩ͷΘ͔ΔϠπͩɻ

    ͚ͲӉ஦͸ϠόΠɻͦΜͳͷؾʹ͠ͳ͍ɻ๲ு͠·͘Γɻ࠷΋ԕ͔͘Β౸ୡ͢Δޫͱ͔؍ଌͯ͠΋Α͘Θ͔Μͳ͍͘Β͍ԕ͍ɻϠό
    ͗͢ɻ

    ແݶ͍͚ͬͯͨͲɺ΋͔ͨ͠͠Β༗ݶ͔΋͠Μͳ͍ɻͰ΋༗ݶͬͯࣄʹ͢Δͱ

    ʮ͡Ό͋ɺӉ஦ͷ୺ͷ֎ଆͬͯφχΑʁʯ

    ͬͯࣄʹͳΔ͠ɺͦΕ͸୭΋Θ͔Βͳ͍ɻϠόΠɻ୭ʹ΋෼͔Βͳ͍ͳΜͯੌ͗͢Δɻ

    ͋ͱ௒פ͍ɻ໿έϧϏϯɻઁࢯͰݴ͏ͱʵˆɻϠόΠɻפ͗͢ɻόφφͰఝଧͭՋ΋ͳ͘ࢮ͵ɻා͍ɻ

    ͦΕʹ௒Կ΋ແ͍ɻ௒ΨϥΨϥɻͦΕʹ௒ͷΜͼΓɻԯ೥ͱ͔ฏؾͰग़ͯ͘Δɻԯ೥ͯɻখֶੜͰ΋ݴΘͶ͐Αɺ࠷ۙɻ

    ͳΜͭͬͯ΋Ӊ஦͸അྗ͕ੌ͍ɻແݶͱ͔ฏؾͩ͠ɻ

    ͏ͪΒͳΜͯແݶͱ͔͔͔ͨͩੵ෼ܭࢉͰग़͖͚ͯͨͩͰ্ख͘ѻ͑ͳ͍͔Β༗ݶʹͨ͠ΓɺGͱஔ͍ͯΈͨΓɺԋࢉࢠ࢖ͬͨΓ͢
    ͷʹɺ

    Ӊ஦͸શવฏؾɻແݶΛແݶͷ··ѻͬͯΔɻੌ͍ɻϠόΠɻ

    ͱʹ͔͘و༷ΒɺӉ஦ͷϠό͞Λ΋ͬͱ஌Δ΂͖ͩͱࢥ͍·͢ɻ

    /^.+(Ӊ஦|ϠόΠ|[\s\S])*.+$/
    จࣈͰඵ͔͔Δͷ͸ϠόΠɻ

    View full-size slide

  7. ϠόΠɻӉ஦ϠόΠɻ·͡ͰϠόΠΑɺϚδϠόΠɻ

    Ӊ஦ϠόΠɻ

    ·ͣ޿͍ɻ΋͏޿͍ͳΜͯ΋Μ͡Όͳ͍ɻ௒޿͍ɻ

    ޿͍ͱ͔ͬͯ΋

    ʮ౦ژυʔϜݸͿΜ͘Β͍ʁʯ

    ͱ͔ɺ΋͏ɺͦ͏͍͏Ϩϕϧ͡Όͳ͍ɻ

    Կ͠ΖແݶɻεήΣʂͳΜ͔୯Ґͱ͔ແ͍ͷɻԿ௶ͱ͔Կᶨͱ͔Λ௒ӽͯ͠Δɻແݶͩ͠௒޿͍ɻ

    ͔͠΋๲ுͯ͠ΔΒ͍͠ɻϠόΠΑɺ๲ுͩΑɻ

    ͩͬͯී௨͸஍ٿͱ͔๲ு͠ͳ͍͡ΌΜɻͩͬͯࣗ෼ͷ෦԰ͷ࿓Լ͕ͩΜͩΜ৳ͼͯͬͨΒࠔΔ͡ΌΜɻτΠϨͱ͔௒ԕ͍ͱ͔ࠔΔ
    ͬ͠ΐɻ

    ௨ֶ࿏͕৳ͼͯɺҰ೥ͷͱ͖͸ెา෼ͩͬͨͷʹɺࡾ೥ͷͱ͖͸ࣗసंͰೋ࣌ؒͱ͔ٽͬ͘͠ΐɻ

    ͔ͩΒ஍ٿͱ͔๲ு͠ͳ͍ɻ࿩ͷΘ͔ΔϠπͩɻ

    ͚ͲӉ஦͸ϠόΠɻͦΜͳͷؾʹ͠ͳ͍ɻ๲ு͠·͘Γɻ࠷΋ԕ͔͘Β౸ୡ͢Δޫͱ͔؍ଌͯ͠΋Α͘Θ͔Μͳ͍͘Β͍ԕ͍ɻϠό
    ͗͢ɻ

    ແݶ͍͚ͬͯͨͲɺ΋͔ͨ͠͠Β༗ݶ͔΋͠Μͳ͍ɻͰ΋༗ݶͬͯࣄʹ͢Δͱ

    ʮ͡Ό͋ɺӉ஦ͷ୺ͷ֎ଆͬͯφχΑʁʯ

    ͬͯࣄʹͳΔ͠ɺͦΕ͸୭΋Θ͔Βͳ͍ɻϠόΠɻ୭ʹ΋෼͔Βͳ͍ͳΜͯੌ͗͢Δɻ

    ͋ͱ௒פ͍ɻ໿έϧϏϯɻઁࢯͰݴ͏ͱʵˆɻϠόΠɻפ͗͢ɻόφφͰఝଧͭՋ΋ͳ͘ࢮ͵ɻා͍ɻ

    ͦΕʹ௒Կ΋ແ͍ɻ௒ΨϥΨϥɻͦΕʹ௒ͷΜͼΓɻԯ೥ͱ͔ฏؾͰग़ͯ͘Δɻԯ೥ͯɻখֶੜͰ΋ݴΘͶ͐Αɺ࠷ۙɻ

    ͳΜͭͬͯ΋Ӊ஦͸അྗ͕ੌ͍ɻແݶͱ͔ฏؾͩ͠ɻ

    ͏ͪΒͳΜͯແݶͱ͔͔͔ͨͩੵ෼ܭࢉͰग़͖͚ͯͨͩͰ্ख͘ѻ͑ͳ͍͔Β༗ݶʹͨ͠ΓɺGͱஔ͍ͯΈͨΓɺԋࢉࢠ࢖ͬͨΓ͢
    ͷʹɺ

    Ӊ஦͸શવฏؾɻແݶΛແݶͷ··ѻͬͯΔɻੌ͍ɻϠόΠɻ

    ͱʹ͔͘و༷ΒɺӉ஦ͷϠό͞Λ΋ͬͱ஌Δ΂͖ͩͱࢥ͍·͢ɻ

    /^.+(Ӊ஦|ϠόΠ|[\s\S])*.+$/
    ݱ୅ͷ$16͕ɺ
    ඵͰจࣈఔ౓ॲཧͰ͖ͳ͍Θ͚͕ͳ͍ɻ

    View full-size slide

  8. ϠόΠɻӉ஦ϠόΠɻ·͡ͰϠόΠΑɺϚδϠόΠɻ

    Ӊ஦ϠόΠɻ

    ·ͣ޿͍ɻ΋͏޿͍ͳΜͯ΋Μ͡Όͳ͍ɻ௒޿͍ɻ

    ޿͍ͱ͔ͬͯ΋

    ʮ౦ژυʔϜݸͿΜ͘Β͍ʁʯ

    ͱ͔ɺ΋͏ɺͦ͏͍͏Ϩϕϧ͡Όͳ͍ɻ

    Կ͠ΖແݶɻεήΣʂͳΜ͔୯Ґͱ͔ແ͍ͷɻԿ௶ͱ͔Կᶨͱ͔Λ௒ӽͯ͠Δɻແݶͩ͠௒޿͍ɻ

    ͔͠΋๲ுͯ͠ΔΒ͍͠ɻϠόΠΑɺ๲ுͩΑɻ

    ͩͬͯී௨͸஍ٿͱ͔๲ு͠ͳ͍͡ΌΜɻͩͬͯࣗ෼ͷ෦԰ͷ࿓Լ͕ͩΜͩΜ৳ͼͯͬͨΒࠔΔ͡ΌΜɻτΠϨͱ͔௒ԕ͍ͱ͔ࠔΔ
    ͬ͠ΐɻ

    ௨ֶ࿏͕৳ͼͯɺҰ೥ͷͱ͖͸ెา෼ͩͬͨͷʹɺࡾ೥ͷͱ͖͸ࣗసंͰೋ࣌ؒͱ͔ٽͬ͘͠ΐɻ

    ͔ͩΒ஍ٿͱ͔๲ு͠ͳ͍ɻ࿩ͷΘ͔ΔϠπͩɻ

    ͚ͲӉ஦͸ϠόΠɻͦΜͳͷؾʹ͠ͳ͍ɻ๲ு͠·͘Γɻ࠷΋ԕ͔͘Β౸ୡ͢Δޫͱ͔؍ଌͯ͠΋Α͘Θ͔Μͳ͍͘Β͍ԕ͍ɻϠό
    ͗͢ɻ

    ແݶ͍͚ͬͯͨͲɺ΋͔ͨ͠͠Β༗ݶ͔΋͠Μͳ͍ɻͰ΋༗ݶͬͯࣄʹ͢Δͱ

    ʮ͡Ό͋ɺӉ஦ͷ୺ͷ֎ଆͬͯφχΑʁʯ

    ͬͯࣄʹͳΔ͠ɺͦΕ͸୭΋Θ͔Βͳ͍ɻϠόΠɻ୭ʹ΋෼͔Βͳ͍ͳΜͯੌ͗͢Δɻ

    ͋ͱ௒פ͍ɻ໿έϧϏϯɻઁࢯͰݴ͏ͱʵˆɻϠόΠɻפ͗͢ɻόφφͰఝଧͭՋ΋ͳ͘ࢮ͵ɻා͍ɻ

    ͦΕʹ௒Կ΋ແ͍ɻ௒ΨϥΨϥɻͦΕʹ௒ͷΜͼΓɻԯ೥ͱ͔ฏؾͰग़ͯ͘Δɻԯ೥ͯɻখֶੜͰ΋ݴΘͶ͐Αɺ࠷ۙɻ

    ͳΜͭͬͯ΋Ӊ஦͸അྗ͕ੌ͍ɻແݶͱ͔ฏؾͩ͠ɻ

    ͏ͪΒͳΜͯແݶͱ͔͔͔ͨͩੵ෼ܭࢉͰग़͖͚ͯͨͩͰ্ख͘ѻ͑ͳ͍͔Β༗ݶʹͨ͠ΓɺGͱஔ͍ͯΈͨΓɺԋࢉࢠ࢖ͬͨΓ͢
    ͷʹɺ

    Ӊ஦͸શવฏؾɻແݶΛແݶͷ··ѻͬͯΔɻੌ͍ɻϠόΠɻ

    ͱʹ͔͘و༷ΒɺӉ஦ͷϠό͞Λ΋ͬͱ஌Δ΂͖ͩͱࢥ͍·͢ɻ

    /^.+(Ӊ஦|ϠόΠ|[\s\S])*.+$/
    ͡Ό͋Կ͕ѱ͍ʁ

    View full-size slide

  9. ϠόΠɻӉ஦ϠόΠɻ·͡ͰϠόΠΑɺϚδϠόΠɻ

    Ӊ஦ϠόΠɻ

    ·ͣ޿͍ɻ΋͏޿͍ͳΜͯ΋Μ͡Όͳ͍ɻ௒޿͍ɻ

    ޿͍ͱ͔ͬͯ΋

    ʮ౦ژυʔϜݸͿΜ͘Β͍ʁʯ

    ͱ͔ɺ΋͏ɺͦ͏͍͏Ϩϕϧ͡Όͳ͍ɻ

    Կ͠ΖແݶɻεήΣʂͳΜ͔୯Ґͱ͔ແ͍ͷɻԿ௶ͱ͔Կᶨͱ͔Λ௒ӽͯ͠Δɻແݶͩ͠௒޿͍ɻ

    ͔͠΋๲ுͯ͠ΔΒ͍͠ɻϠόΠΑɺ๲ுͩΑɻ

    ͩͬͯී௨͸஍ٿͱ͔๲ு͠ͳ͍͡ΌΜɻͩͬͯࣗ෼ͷ෦԰ͷ࿓Լ͕ͩΜͩΜ৳ͼͯͬͨΒࠔΔ͡ΌΜɻτΠϨͱ͔௒ԕ͍ͱ͔ࠔΔ
    ͬ͠ΐɻ

    ௨ֶ࿏͕৳ͼͯɺҰ೥ͷͱ͖͸ెา෼ͩͬͨͷʹɺࡾ೥ͷͱ͖͸ࣗసंͰೋ࣌ؒͱ͔ٽͬ͘͠ΐɻ

    ͔ͩΒ஍ٿͱ͔๲ு͠ͳ͍ɻ࿩ͷΘ͔ΔϠπͩɻ

    ͚ͲӉ஦͸ϠόΠɻͦΜͳͷؾʹ͠ͳ͍ɻ๲ு͠·͘Γɻ࠷΋ԕ͔͘Β౸ୡ͢Δޫͱ͔؍ଌͯ͠΋Α͘Θ͔Μͳ͍͘Β͍ԕ͍ɻϠό
    ͗͢ɻ

    ແݶ͍͚ͬͯͨͲɺ΋͔ͨ͠͠Β༗ݶ͔΋͠Μͳ͍ɻͰ΋༗ݶͬͯࣄʹ͢Δͱ

    ʮ͡Ό͋ɺӉ஦ͷ୺ͷ֎ଆͬͯφχΑʁʯ

    ͬͯࣄʹͳΔ͠ɺͦΕ͸୭΋Θ͔Βͳ͍ɻϠόΠɻ୭ʹ΋෼͔Βͳ͍ͳΜͯੌ͗͢Δɻ

    ͋ͱ௒פ͍ɻ໿έϧϏϯɻઁࢯͰݴ͏ͱʵˆɻϠόΠɻפ͗͢ɻόφφͰఝଧͭՋ΋ͳ͘ࢮ͵ɻා͍ɻ

    ͦΕʹ௒Կ΋ແ͍ɻ௒ΨϥΨϥɻͦΕʹ௒ͷΜͼΓɻԯ೥ͱ͔ฏؾͰग़ͯ͘Δɻԯ೥ͯɻখֶੜͰ΋ݴΘͶ͐Αɺ࠷ۙɻ

    ͳΜͭͬͯ΋Ӊ஦͸അྗ͕ੌ͍ɻແݶͱ͔ฏؾͩ͠ɻ

    ͏ͪΒͳΜͯແݶͱ͔͔͔ͨͩੵ෼ܭࢉͰग़͖͚ͯͨͩͰ্ख͘ѻ͑ͳ͍͔Β༗ݶʹͨ͠ΓɺGͱஔ͍ͯΈͨΓɺԋࢉࢠ࢖ͬͨΓ͢
    ͷʹɺ

    Ӊ஦͸શવฏؾɻແݶΛແݶͷ··ѻͬͯΔɻੌ͍ɻϠόΠɻ

    ͱʹ͔͘و༷ΒɺӉ஦ͷϠό͞Λ΋ͬͱ஌Δ΂͖ͩͱࢥ͍·͢ɻ

    /^.+(Ӊ஦|ϠόΠ|[\s\S])*.+$/
    ਖ਼نදݱͷϚονϯά࣌ؒͷരൃɺ

    View full-size slide

  10. ϠόΠɻӉ஦ϠόΠɻ·͡ͰϠόΠΑɺϚδϠόΠɻ

    Ӊ஦ϠόΠɻ

    ·ͣ޿͍ɻ΋͏޿͍ͳΜͯ΋Μ͡Όͳ͍ɻ௒޿͍ɻ

    ޿͍ͱ͔ͬͯ΋

    ʮ౦ژυʔϜݸͿΜ͘Β͍ʁʯ

    ͱ͔ɺ΋͏ɺͦ͏͍͏Ϩϕϧ͡Όͳ͍ɻ

    Կ͠ΖແݶɻεήΣʂͳΜ͔୯Ґͱ͔ແ͍ͷɻԿ௶ͱ͔Կᶨͱ͔Λ௒ӽͯ͠Δɻແݶͩ͠௒޿͍ɻ

    ͔͠΋๲ுͯ͠ΔΒ͍͠ɻϠόΠΑɺ๲ுͩΑɻ

    ͩͬͯී௨͸஍ٿͱ͔๲ு͠ͳ͍͡ΌΜɻͩͬͯࣗ෼ͷ෦԰ͷ࿓Լ͕ͩΜͩΜ৳ͼͯͬͨΒࠔΔ͡ΌΜɻτΠϨͱ͔௒ԕ͍ͱ͔ࠔΔ
    ͬ͠ΐɻ

    ௨ֶ࿏͕৳ͼͯɺҰ೥ͷͱ͖͸ెา෼ͩͬͨͷʹɺࡾ೥ͷͱ͖͸ࣗసंͰೋ࣌ؒͱ͔ٽͬ͘͠ΐɻ

    ͔ͩΒ஍ٿͱ͔๲ு͠ͳ͍ɻ࿩ͷΘ͔ΔϠπͩɻ

    ͚ͲӉ஦͸ϠόΠɻͦΜͳͷؾʹ͠ͳ͍ɻ๲ு͠·͘Γɻ࠷΋ԕ͔͘Β౸ୡ͢Δޫͱ͔؍ଌͯ͠΋Α͘Θ͔Μͳ͍͘Β͍ԕ͍ɻϠό
    ͗͢ɻ

    ແݶ͍͚ͬͯͨͲɺ΋͔ͨ͠͠Β༗ݶ͔΋͠Μͳ͍ɻͰ΋༗ݶͬͯࣄʹ͢Δͱ

    ʮ͡Ό͋ɺӉ஦ͷ୺ͷ֎ଆͬͯφχΑʁʯ

    ͬͯࣄʹͳΔ͠ɺͦΕ͸୭΋Θ͔Βͳ͍ɻϠόΠɻ୭ʹ΋෼͔Βͳ͍ͳΜͯੌ͗͢Δɻ

    ͋ͱ௒פ͍ɻ໿έϧϏϯɻઁࢯͰݴ͏ͱʵˆɻϠόΠɻפ͗͢ɻόφφͰఝଧͭՋ΋ͳ͘ࢮ͵ɻා͍ɻ

    ͦΕʹ௒Կ΋ແ͍ɻ௒ΨϥΨϥɻͦΕʹ௒ͷΜͼΓɻԯ೥ͱ͔ฏؾͰग़ͯ͘Δɻԯ೥ͯɻখֶੜͰ΋ݴΘͶ͐Αɺ࠷ۙɻ

    ͳΜͭͬͯ΋Ӊ஦͸അྗ͕ੌ͍ɻແݶͱ͔ฏؾͩ͠ɻ

    ͏ͪΒͳΜͯແݶͱ͔͔͔ͨͩੵ෼ܭࢉͰग़͖͚ͯͨͩͰ্ख͘ѻ͑ͳ͍͔Β༗ݶʹͨ͠ΓɺGͱஔ͍ͯΈͨΓɺԋࢉࢠ࢖ͬͨΓ͢
    ͷʹɺ

    Ӊ஦͸શવฏؾɻແݶΛແݶͷ··ѻͬͯΔɻੌ͍ɻϠόΠɻ

    ͱʹ͔͘و༷ΒɺӉ஦ͷϠό͞Λ΋ͬͱ஌Δ΂͖ͩͱࢥ͍·͢ɻ

    /^.+(Ӊ஦|ϠόΠ|[\s\S])*.+$/
    ͜Ε͕3F%P4ɻ

    View full-size slide

  11. @MakeNowJust ౻࿘େ໻
    cYAPC::Japan::Online 2022
    3F%P4ݕग़ͷ࠷ઌ୺

    SFDIFDLͷ঺հ

    View full-size slide

  12. ਖ਼نදݱͷϚονϯά࣌ؒ͸

    രൃ͢Δ

    View full-size slide

  13. Ͳ͏ʹ͔ͯ͠ਖ਼نදݱΛ

    ҆શʹ࢖͍͍ͨ
    ʮʜʜ%'"ܕͷϚονϯάʹ͢Ε͹ʁʯ
    ʮʜʜλΠϜΞ΢τ͢Ε͹͍͍Μ͡Όͳ͍ʁʯ

    View full-size slide

  14. ͢΂ͯͷਖ਼نදݱͷϚονϯά͕࣌ؒ

    രൃ͢ΔΘ͚͡Όͳ͍
    /^(foo|bar)*$/
    ҆શ
    /^<[^@<]*@[^>@]*>$/
    /^(fizz|buzz|fizzbuzz)*$/
    രൃ͢Δ
    /^<[^<]*@[^>]*>$/

    View full-size slide

  15. ਖ਼نදݱ͕҆શ͔Ͳ͏͔Λ൑ఆ͍ͨ͠
    /^(foo|bar)*$/
    ҆શ
    /^<[^@<]*@[^>@]*>$/
    /^(fizz|buzz|fizzbuzz)*$/
    രൃ͢Δ
    /^<[^<]*@[^>]*>$/

    View full-size slide

  16. ˠ3F%P4ݕग़
    /^(foo|bar)*$/
    ҆શ
    /^<[^@<]*@[^>@]*>$/
    /^(fizz|buzz|fizzbuzz)*$/
    രൃ͢Δ
    /^<[^<]*@[^>]*>$/

    View full-size slide

  17. രൃ͢Δਖ਼نදݱͷಛ௃
    /^(fizz|buzz|fizzbuzz)*$/
    രൃ͢Δ
    /^<[^<]*@[^>]*>$/

    View full-size slide

  18. ਖ਼نදݱͷരൃͷ࢓ํ͸छྨ͋Δ
    จࣈྻͷ௕͞ ʹରͯ͠Ϛονϯά࣌ؒͷ࠷ѱܭࢉྔ͕ɺ
    ʹͳΔ ࢦ਺తͳ
    ৔߹

    ɹྫ/^(fizz|buzz|fizzbuzz)*$/ ߈ܸจࣈྻ('fizzbuzz' x 27) . 'x'


    ɹจࣈҎԼͰ߈ܸͰ͖ΔͨΊͱͯ΋ϠόΠɻ
    ʹͳΔ ৐తͳ
    ৔߹

    ɹྫ/^<[^<]*@[^>]*>$/ ߈ܸจࣈྻ'<' . ('@' x 54773)


    ɹ߈ܸʹ͸਺ઍʙ਺ສจࣈඞཁͳͨΊɺۓٸ౓͸௿Ίɻ

    ɹ͔͠͠ɺ4UBDL0WFS
    fl
    PX΍$MPVE
    fl
    BSF͕࣮ࡍʹ3F%P4Ͱμ΢ϯͨ͠ͷ͸͜ͷέʔεɻ
    n
    O(2n)
    O(n2)

    View full-size slide

  19. ʹͳΔ ࢦ਺తͳ
    ৔߹ͷಛ௃
    O(2n)
    ܁Γฦ͠ͷதͷϚονϯάͷ࢓ํ͕ᐆດ
    ྫ͑͹/^(fizz|buzz|fizzbuzz)*$/ͷ৔߹ɺ

    "fizzbuzz"ͷϚονϯάͷ࢓ํ͕ɺ

    1."fizzbuzz"ͱ2."fizzbuzz"ͷ௨Γ͋Δɻ
    "fizzbuzz"͕OݸฒΜͰ͍ͯ࠷ޙͰόοΫτϥοΫ͢Δͱɺ

    ྆ํͷ௨ΓํΛͦΕͧΕʹରͯ͠ࢼ͞ͳ͚Ε͹͍͚ͳ͍ͨΊɺ

    ࢦ਺తͳ ͷܭࢉྔʹͳΔɻ
    O(2n)

    View full-size slide

  20. ʹͳΔ ৐తͳ
    ৔߹ͷಛ௃
    O(n2)
    ͭͷ܁Γฦ͠ͱͦͷؒͷϚονϯάͷ࢓ํ͕ᐆດ
    ྫ͑͹/^<[^<]*@[^>]*>$/ͷ৔߹ɺ

    "@"ͷจࣈͰ[^<]*ͱ[^>]*Λ܁Γฦ͢ͷͱ

    @Ͱ܁Γฦ͠ΛҠಈ͢Δ͜ͱ͕Ͱ͖Δɻ
    "@"͕OݸฒΜͰ͍ͯ࠷ޙͰόοΫτϥοΫ͢Δͱɺ

    Ͳ͜Ͱࠨ͔Βӈͷ܁Γฦ͠ʹҠಈ͢Δ͔͕ᐆດʹͳΔͨΊɺ

    ৐తͳ ͷܭࢉྔʹͳΔɻ
    O(n2)

    View full-size slide

  21. ͡Ό͋ਖ਼نදݱΛݟͯ

    ൑அ͢Ε͹͍͍ʁ

    View full-size slide

  22. ͦΕ͸݁ߏ೉͍͠
    ׳ΕΔͱ݁ߏ΍ΕΔ͚Ͳɺ

    ਖ਼֬ੑΛอূ͢Δͷ͸೉͍͠

    ਖ਼نදݱ͸SFHFYMJCDPNΑΓ

    /([^\.\?\!]*)[\.\?\!]/
    /"((\\")|[^"(\\")])+"/
    /^[0-9]{1,}(,[0-9]+){0,}$/
    /"[^"\r\n]*"/
    /(\S*)+(\u007C)+(\S*)/
    /\s*[a-zA^Z,\s]+\s*$/

    View full-size slide

  23. ΦʔτϚτϯʹม׵ͯ͠ΈΑ͏

    View full-size slide

  24. ʹͳΔ ࢦ਺తͳ
    ৔߹ͷಛ௃
    O(2n)
    &%" &YQPOFOUJBM%FHSFF"NCJHVJUZ
    ߏ଄
    q
    fizz buzz
    fizzbuzz
    q
    w
    w
    ͋Δจࣈྻ Ͱ͋Δঢ়ଶ ʹ

    ໭ͬͯ͘Δํ๏͕௨Γ͋Δ
    w q
    q
    fizzbuzz
    fizzbuzz
    ੔ཧ

    View full-size slide

  25. ʹͳΔ ৐తͳ
    ৔߹ͷಛ௃
    O(n2)
    *%" *O
    fi
    OJUF%FHSFF"NCJHVJUZ
    ߏ଄
    q1
    q2
    [^<] [^>]
    @ q1
    q2
    w
    ಉ͡จࣈྻ Ͱঢ়ଶ ʹ໭ͬͯ͜Εͯɺ

    ͦͷؒ΋ભҠͰ͖Δɻ
    w q1
    , q2
    w
    w

    View full-size slide

  26. &%"ߏ଄ɾ*%"ߏ଄ͷ୳ࡧΞϧΰϦζϜ
    ΦʔτϚτϯͷੵߏ੒ͷΑ͏ʹͯ͠ঢ়ଶΛ૊ʹͨ͠ΦʔτϚτϯΛߏ੒͢Δɻ

    ͷͱ͖ʹ

    ͜ͷભҠؔ਺Λڧ࿈݁੒෼෼ղͯ͠ɺ

    ಉ͡ڧ࿈݁੒෼ʹ ͱ ͨͩ͠
    ͷΑ͏ͳ

    ঢ়ଶͷ૊͕͋Ε͹&%"ߏ଄͕ଘࡏ͢Δɻ
    *%"ߏ଄ͷ৔߹͸ɺঢ়ଶΛͭ૊ʹͯ͠

    ͱ ͷΑ͏ͳ૊Λ୳͢͜ͱͰൃݟͰ͖Δɻ
    q11
    a
    q12
    ∧ q21
    a
    q22
    (q11
    , q21
    ) a (q12
    , q22
    )
    (q1
    , q1
    ) (q2
    , q3
    ) q2
    ≠ q3
    (q1
    , q1
    , q2
    ) (q1
    , q2
    , q2
    )

    View full-size slide

  27. &%"ߏ଄ɾ*%"ߏ଄ͷੑ࣭
    &%"ߏ଄͕ଘࡏ͢Δ Ϛονϯάͷ࠷ѱܭࢉྔ͕ࢦ਺తʹͳΔ
    *%"ߏ଄͕ଘࡏ͢Δ Ϛονϯάͷ࠷ѱܭࢉྔ͕৐తʹͳΔɻ
    ͭ·Γɺ
    ɹɹ&%"ߏ଄ɾ*%"ߏ଄ͷଘࡏΛ൑ఆ͢Δ͜ͱͰɺ

    ɹɹਖ਼نදݱͷϚονϯά͕࣌ؒരൃ͢Δ͔͸

    ɹɹཧ࿦తʹ͸ਖ਼֬ʹ൑ఆͰ͖Δɻ



    View full-size slide

  28. 3F%P4ݕग़ɾ׬
    ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʜʜʁ

    View full-size slide

  29. ΦʔτϚτϯͷղੳʹΑΔ3F%P4ݕग़ͷݶք

    ༗ݶঢ়ଶΦʔτϚτϯΛར༻͍ͯ͠ΔͷͰɺ

    ม׵ͷͰ͖ͳ͍ޙํࢀর \1, \2
    ͷΑ͏ͳ֦ு͕͋Δͱղੳ͕ෆՄೳɻ

    /<(\w+)>(.*?)<\/\1>/
    /(["'])[^"']+\1/

    View full-size slide

  30. ΦʔτϚτϯͷղੳʹΑΔ3F%P4ݕग़ͷݶք

    ղੳΞϧΰϦζϜͷܭࢉྔ΋ঢ়ଶ਺ʹରͯ͠ ͱɺ

    ෳࡶͳਖ਼نදݱͷ৔߹͸ղੳʹ͕͔͔࣌ؒΔɻ
    ͞ΒʹɺόοΫτϥοΫͷڍಈΛਖ਼֬ʹ࠶ݱ͢Δ৔߹͸ܾఆԽ͕ඞཁʹͳΓɺ

    ͦͷ৔߹ͷղੳͷܭࢉྔ͸ࢦ਺తʹͳͬͯ͠·͏ɻ
    O(n6)

    /(\w+(\.\w+)*)@(([\w\-]{1,32}\.){0,4}[a-zA-Z]{1,32}|\[(\d{0,3}(\.\d{0,3}){0,4})\])/

    View full-size slide

  31. ΦʔτϚτϯͷղੳʹΑΔ3F%P4ݕग़ͷݶք
    ͭ·Γɺਖ਼نදݱ͕ෳࡶͳ৔߹΍ɺਖ਼نݴޠͰͳ͍֦ுʹରͯ͠͸ɺ

    ΦʔτϚτϯͷղੳʹΑΔݕग़͸ແྗ

    /<(\w+)>(.*?)<\/\1>/
    /(["'])[^"']+\1/
    /(\w+(\.\w+)*)@(([\w\-]{1,32}\.){0,4}[a-zA-Z]{1,32}|\[(\d{0,3}(\.\d{0,3}){0,4})\])/

    View full-size slide

  32. 3F%P4ݕग़ͷ࠷ઌ୺΁

    View full-size slide

  33. ಈతղੳ

    ࣮ࡍʹϚονϯάΛߦͳͬͯɺ࣌ؒͷ͔͔Δ΋ͷΛ୳͢
    ਖ਼نදݱ

    ࣮૷
    ೖྗ
    Ϛονϯά͕࣌ؒ
    രൃ͢Δ΋ͷΛൃݟ 3F%P4੬ऑ

    ͱͯ͠ݕग़
    "foo"
    จࣈྻ

    View full-size slide

  34. ϑΝδϯά

    จࣈྻΛϥϯμϜʹͨ͘͞Μੜ੒ͯ͠ɺಈతղੳΛ͢Δ
    "foo" "bar"
    "foobar"
    ͨ͘͞Μͷจࣈྻ
    ਖ਼نදݱ

    ࣮૷
    ೖྗ
    Ϛονϯά͕࣌ؒ
    രൃ͢Δ΋ͷΛൃݟ 3F%P4੬ऑ

    ͱͯ͠ݕग़

    View full-size slide

  35. Ҩ఻తΞϧΰϦζϜ

    Ϛονϯάʹ࣌ؒͷ͔͔ΔจࣈྻΛֻ͚߹Θͤͯɺ

    ΑΓ࣌ؒͷ͔͔ΔจࣈྻΛੜ੒͢Δ
    Ҩ఻తΞϧΰϦζϜͰ

    Ϛονϯά࣌ؒΛ૿Ճͤ͞Δ
    "foo" "bar"
    "foobar"
    ͨ͘͞Μͷจࣈྻ
    ਖ਼نදݱ

    ࣮૷
    ೖྗ
    Ϛονϯά͕࣌ؒ
    രൃ͢Δ΋ͷΛൃݟ 3F%P4੬ऑ

    ͱͯ͠ݕग़

    View full-size slide

  36. ϑΝδϯάʹΑΔ3F%P4ݕग़
    ಈతղੳʹΑΔ3F%P4ݕग़ख๏ɻ
    ϥϯμϜੑ͕͋ΔͷͰਖ਼֬ੑʹ΍΍೉͕͋Δ͕ Ͱ͖ͳ͍ΑΓ͸Ϛγ
    ɺ

    ޙํࢀরͳͲͷ֦ு΍ঢ়ଶ਺ͷଟ͘ͳΔෳࡶͳਖ਼نදݱʹ΋ରԠͰ͖Δɻ
    Ҩ఻తΞϧΰϦζϜͰ

    Ϛονϯά࣌ؒΛ૿Ճͤ͞Δ
    "foo" "bar"
    "foobar"
    ͨ͘͞Μͷจࣈྻ
    ਖ਼نදݱ

    ࣮૷
    ೖྗ
    Ϛονϯά͕࣌ؒ
    രൃ͢Δ΋ͷΛൃݟ 3F%P4੬ऑ

    ͱͯ͠ݕग़

    View full-size slide

  37. ϑΝδϯά࠷ڧʁ

    View full-size slide

  38. ͳ৔߹ͷ߈ܸจࣈྻ͸

    ਺ઍʙ਺ສจࣈ
    O(n2)

    View full-size slide

  39. Ԑ͕γΣΠΫεϐΞΛॻ͘ͷΛ

    ଴ͭΘ͚ʹ͸͍͔ͳ͍
    ͍͘ΒҨ఻తΞϧΰϦζϜΛ࢖ͬͯ΋ɺ
    ਺ສจࣈͷ࠷దԽΛ্ख͘ߦ͏Ͱ͖Δ͔͸ӡήʔͳͷͰɺ
    ͷ৔߹͸͏·͘ൃݟͰ͖ͳ͍͜ͱ͕ଟ͘ͳͬͯ͠·͏
    O(n2)

    View full-size slide

  40. จࣈྻͷ܁Γฦ͠ߏ଄
    Ϛονϯά࣌ؒΛരൃͤ͞Δจࣈྻ͸෦෼తʹ܁Γฦ͍ͯ͠Δɻ

    ྫ('fizzbuzz' x 27) . 'x' '<' . ('@' x 54773)

    ੜ੒͞ΕΔจࣈྻʹ࣍ͷ จࣈΛ܁Γฦ͢ͱ͍͏ҙຯͷه߸ Λ௥Ճͯ͠ɺ

    ͦΕΛؚΊͯϑΝδϯάΛߦ͏ɻ
    ͜ΕʹΑͬͯɺ৐తͳ৔߹Ͱ΋ϑΝδϯάʹΑͬͯݕग़͕ՄೳʹͳΔɻ
    n □ n

    View full-size slide

  41. ϑΝδϯά࠷ڧ

    ͲͷΑ͏ͳ৔߹Ͱ΋രൃ͢Δਖ਼نදݱΛਖ਼͘͠ൃݟͰ͖ΔΑ͏ʹͳͬͨ

    View full-size slide

  42. SFDIFDL
    ൃදऀ !.BLF/PX+VTU
    ͷ։ൃ͍ͯ͠Δ3F%P4ݕग़ϥΠϒϥϦɻ
    ࣮૷ݴޠ͸4DBMBɻ+BWB4DSJQU͔Β΋ར༻Մೳɻ
    ࠓճઆ໌ͨ͠ɺΦʔτϚτϯͷղੳʹΑΔํ๏ͱϑΝδϯάʹΑΔํ๏ͷ

    ྆ํͷํ๏Λ࣮૷͍ͯ͠Δɻ
    IUUQTNBLFOPXKVTUMBCTHJUIVCJPSFDIFDL

    View full-size slide

  43. ΦʔτϚτϯͷղੳ͸ਖ਼͚֬ͩͲɺ

    ͕͔͔࣌ؒΓͦ͏ͳ৔߹͸ϑΝδϯάʹ੾Γସ͍͑ͨ

    View full-size slide

  44. ݕग़ख๏ͷࣗಈ੾Γସ͑
    SFDIFDLͰ͸ɺՄೳͳݶΓΦʔτϚτϯͷղੳʹΑΔख๏Λ࢖ͬͯɺ

    ࣌ؒతɾਫ਼౓తʹϑΝδϯάͷํ͕ద੾ͩͱ൑அͨ͠৔߹ʹɺ

    ϑΝδϯάʹ੾Γସ͑Δػೳ͕࣮૷͞Ε͍ͯΔɻ

    σϑΥϧτͰ͜ͷϞʔυʹͳ͍ͬͯΔɻ

    ͲͪΒ͕ద੾͔͸ɺਖ਼نදݱͷେ͖͞΍

    ΦʔτϚτϯͷঢ়ଶ਺ͳͲ͔Β൑அ͞ΕΔɻ

    View full-size slide

  45. ରԠ͍ͯ͠Δਖ਼نදݱͷํݴ
    ݱࡏ͸+BWB4DSJQUͷਖ਼نදݱʹͷΈରԠɻ
    /&5 +BWB 1$3& 1FSM 1ZUIPO 3VCZͷਖ਼نදݱͷରԠΛ࣮૷தɻ
    +BWB4DSJQUҎ֎ͷݴޠͷਖ਼نදݱ͸͋·Γݫີͳ࢓༷͕ͳ͍ͷͰɺ

    ͳΜͱͳ͘ରԠ͢Δ༧ఆɻ

    View full-size slide

  46. ࣮૷ؒʹ߹Θͳͯ͘
    ͝ΊΜͳ͍͞

    View full-size slide

  47. ࢖͍ํ
    ී௨ʹϥΠϒϥϦͱͯ͠࢖͑Δɻ
    const { check } = require('recheck');

    console.log(await check('^(a|a)*$', ''));


    &4-JOUͷϓϥάΠϯ eslint-plugin-redos
    ΋ެ։͍ͯ͠ΔͷͰɺ

    &4-JOUΛ࢖͍ͬͯΔϓϩδΣΫτʹ͙͢ʹಋೖՄೳɻ

    View full-size slide

  48. IUUQTNBLFOPXKVTUMBCTHJUIVCJPSFDIFDLQMBZHSPVOE

    View full-size slide

  49. ଎౓
    ݸͷਖ਼نදݱͷ3F%P4ݕग़ʹ෼ඵɻ
    ฏۉͯ͠ɺਖ਼نදݱݸลΓඵఔ౓ɻ
    ମײͱͯ͠͸ɺ$*ͳͲͰར༻͢Δ෼ʹ͸े෼࢖͑Δɻ
    ΤσΟλͳͲͰϦΞϧλΠϜʹݕग़͠ଓ͚Δͱɺͪΐͬͱ΋͔ͨͭ͘΋ɻ

    View full-size slide

  50. ࣮੷
    ࣮ࡍʹ͍͔ͭ͘ͷϥΠϒϥϦͷ੬ऑੑΛൃݟɺใࠂ͍͍ͯ͠Δɻ
    NBSLEPXOJU

    ɾIUUQTHJUIVCDPNNBSLEPXOJUNBSLEPXOJUTFDVSJUZBEWJTPSJFT()4"WGDRWGWSD
    NBSLFE

    ɾIUUQTHJUIVCDPNNBSLFEKTNBSLFETFDVSJUZBEWJTPSJFT()4"SSSNRKNWIG

    ɾIUUQTHJUIVCDPNNBSLFEKTNBSLFETFDVSJUZBEWJTPSJFT()4"WISDYYHK
    SFDIFDLΛ࢖ͬͯ੬ऑੑΛൃݟͨ͠৔߹ɺͪ͜Βʹ΋࿈བྷ͍͚ͯͨͩ͠Δͱ͋Γ͕͍ͨͰ͢ɻ

    View full-size slide

  51. ͋ͳͨͱSFDIFDLɺ
    ࠓ͙͢μ΢ϯϩʔυ

    View full-size slide

  52. ൃදͷ·ͱΊ
    w 3F%P4ݕग़͸਺ֶతʹఆࣜԽͰ͖Δղ͚Δ໰୊ɻ

    ͳΜ͔;Θͬͱͨ͠ؾ෼Ͱܭࢉྔ͕രൃ͢ΔΘ͚Ͱ͸ͳ͍ɻ
    w ͱ͸͍͑ݱ࣮ͷਖ਼نදݱΛର৅ʹ͢Δͱ໰୊͕͋ΔͷͰɺ

    ϑΝδϯάͳͲΛซ༻͢Δͷ͕࠷ઌ୺ͷ3F%P4ݕग़ɻ
    w 3F%P4ݕग़ϥΠϒϥϦͱͯ͠SFDIFDL͕͋Δɻ࢖ͬͯ΍͍ͬͯͩ͘͞ɻ
    w ͱ͸͍͑׬શʹਖ਼֬ͳ3F%P4ݕग़Λݱ࣮తͳ࣌ؒͰߦ͏ͷ͸

    ΄ͱΜͲෆՄೳͳͷͰɺݕग़݁Ռ͚ͩΛݟͯ҆શͩͱ൑அͤͣɺ

    λΠϜΞ΢τͳͲΛೖΕΔ΋ͷॏཁɻ

    View full-size slide

  53. ݕূϑΣʔζ
    ࣮ࡍͷਖ਼نදݱ࣮૷͸࠷దԽͳͲ͕͞Ε͍ͯͯɺ

    ཧ࿦௨ΓʹϚονϯά͕࣌ؒ૿Ճ͠ͳ͍Մೳੑ͕͋Δɻ
    ͦͷΑ͏ͳ৔߹ͷͨΊʹSFDIFDLͰ͸ɺ

    ಘΒΕͨ߈ܸจࣈྻΛ࣮ࡍʹॲཧܥʹೖྗͯ͠ɺ

    Ϛονϯάʹ͕͔͔࣌ؒΔ͔ݕূ͢Δػೳ͕ར༻Ͱ͖·͢ɻ
    ͕͔͔࣌ؒΔͷͰσϑΥϧτͰ͸ແޮ


    View full-size slide