Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
「正規表現をつくる」をつくる / make "make regex"
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
TSUYUSATO Kitsune
November 13, 2025
Programming
1
1.4k
「正規表現をつくる」をつくる / make "make regex"
YAPC::Fukuoka 2025での発表『「正規表現をつくる」をつくる』のスライドです。
TSUYUSATO Kitsune
November 13, 2025
Tweet
Share
More Decks by TSUYUSATO Kitsune
See All by TSUYUSATO Kitsune
最近の研究とか、RubyへのContributionとか / Recent My Study and Ruby Contributions
makenowjust
2
280
Make Parsers Compatible Using Automata Learning
makenowjust
3
12k
YAPC::Japan::Online 2022で発表して WEB+DB PRESSに記事を寄稿した話
makenowjust
0
61
Regular Expressions, REXML, Automata Learning
makenowjust
0
430
オートマトン学習しろ / Do automata learning
makenowjust
3
560
#kaigieffect LT 2024 - rexml-css_selector: A REXML extension for supporting CSS selector
makenowjust
1
440
RubyKaigi 2024 - Make Your Own Regex Engine!
makenowjust
1
2.1k
正規表現改善報告する回 / Regexp memoization progress report
makenowjust
2
700
Make Regexp#match much faster
makenowjust
1
3k
Other Decks in Programming
See All in Programming
CopilotKit + AG-UIを学ぶ
nearme_tech
PRO
1
110
PostgreSQL を使った快適な go test 環境を求めて
otakakot
0
370
米国のサイバーセキュリティタイムラインと見る Goの暗号パッケージの進化
tomtwinkle
1
340
CDIの誤解しがちな仕様とその対処TIPS
futokiyo
0
140
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
310
日本だけで解禁されているアプリ起動の方法
ryunakayama
0
360
AIによる高速開発をどう制御するか? ガードレール設置で開発速度と品質を両立させたチームの事例
tonkotsuboy_com
7
2.6k
New in Go 1.26 Implementing go fix in product development
sunecosuri
0
100
Geminiの機能を調べ尽くしてみた
naruyoshimi
0
190
DevinとClaude Code、SREの現場で使い倒してみた件
karia
1
760
猫の手も借りたい!ので AIエージェント猫を作って社内に放した話 Claude Code × Container Lambda の Slack Bot "DevNeko"
naramomi7
0
220
24時間止められないシステムを守る-医療ITにおけるランサムウェア対策の実際
koukimiura
2
180
Featured
See All Featured
Evolving SEO for Evolving Search Engines
ryanjones
0
140
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
220
Reality Check: Gamification 10 Years Later
codingconduct
0
2k
Exploring anti-patterns in Rails
aemeredith
2
280
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.7k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.6k
Facilitating Awesome Meetings
lara
57
6.8k
Building Adaptive Systems
keathley
44
2.9k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
450
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
180
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
117
110k
Transcript
make "make regex" QSFTFOUFECZ@makenowjust )JSPZB'VKJOBNJ BUYAPC::Fukuoka ʮਖ਼نදݱΛͭ͘ΔʯΛ ɹͭ͘Δ
౻࿘େ (Hiroya Fujinami) ࣗݾհ w /** ࠃཱใֶݚڀॴ ͷത࢜՝ఔͷֶੜ w
ઐਖ਼نදݱɾΦʔτϚτϯཧ w ࠷ۙɺΦʔτϚτϯֶश BVUPNBUBMFBSOJOH ໊ू߹ OPNJOBMTFU ʹؔ৺͕͋Δ w 3VCZίϛολᴷᴷදతͳߩݙਖ਼نදݱͷϝϞԽʹΑΔߴԽ w 4503&4ͱ͍͏ձࣾͰόΠτΛ͍ͯ͠Δ 3BJMTͰͷ8FC։ൃ
!NBLF@OPX@KVTU !NBLFOPXKVTU
:"1$ͷࢥ͍ग़ ࣗݾհ w YAPC::Japan::Onlineʹͯ ʮ3F%P4ݕग़ͷ࠷ઌSFDIFDLͷհʯͱ͍͏ൃදΛͨ͠ w ͦͷͱ͖ɺຊདྷͳΒϐβ͕ಧͣͩͬͨ͘ͷ͕ͩ ϐβϋοτͷૹҬ֎ͱ͍͏͜ͱͰಧ͔ͳ͔ͬͨ w
͍͘͠ͷͰࣗͰϐβΛങ͖ͬͯͯ৯͍ͯͨهԱ͕͋Δ w ࠙ձͰϐβ͕ग़ͨΒ৯ਚ͍ͨ͘͠
ਖ਼نදݱɺॻ͖͍ͨͰ͔͢ʁ
ୀ۶ͳ͜ͱ1 ʹΒͤΑ͏
͕ɺ ͦͷͨΊʹਖ਼نදݱΛ ॻ͔ͳ͚Ε͍͚ͳ͍
ͦ͏ͩ ʮਖ਼نදݱΛॻ͍ͯ͘ΕΔʯ ϓϩάϥϜΛॻ͜͏
make "make regex" QSFTFOUFECZ@makenowjust )JSPZB'VKJOBNJ BUYAPC::Fukuoka ʮਖ਼نදݱΛͭ͘ΔʯΛ ɹͭ͘Δ
͋ΘΑ͘ɺ ΦʔτϚτϯཧΛ ͑Δͱ͍͍ͳ ઐͳͷͰ
৽ͨͳղܾࡦ ͷ֬ೝ ϩʔυϚοϓ τʔΫͷྲྀΕ ੜ"* --. ཧతͳํ๏ 1FSMͰ ؆୯ͳղܾࡦ 1
2 3
৽ͨͳղܾࡦ ͷ֬ೝ ϩʔυϚοϓ τʔΫͷྲྀΕ 1 3 ੜ"* --. ཧతͳํ๏
1FSMͰ ؆୯ͳղܾࡦ 2 2
৽ͨͳղܾࡦ ͷ֬ೝ ϩʔυϚοϓ τʔΫͷྲྀΕ 1 3 ੜ"* --. ཧతͳํ๏
1FSMͰ ؆୯ͳղܾࡦ 2 ځ 2
৽ͨͳղܾࡦ ͷ֬ೝ ϩʔυϚοϓ τʔΫͷྲྀΕ 1 3 ੜ"* --. ཧతͳํ๏
1FSMͰ ؆୯ͳղܾࡦ 2 ځ 2 ڀ
զʑͷٻΊΔͱ͜Ζ ʮਖ਼نදݱΛॻ͍ͯ͘ΕΔʯ ϓϩάϥϜ͕ཉ͍͠ ͷ֬ೝ
ීஈͲ͏ͬͯਖ਼نදݱΛॻ͘ʁ ͲΜͳਖ਼نදݱ͕ ཉ͍͠ͷ͔ʁ ༷ɾݴޠԽ 1 ςετέʔεΛ ߟ͑Δ 2 ࣮ࡍʹ
ਖ਼نදݱΛॻ͘ 3
ීஈͲ͏ͬͯਖ਼نදݱΛॻ͘ʁ ͲΜͳਖ਼نදݱ͕ ཉ͍͠ͷ͔ʁ ༷ɾݴޠԽ 1 ςετέʔεΛ ߟ͑Δ 2 ࣮ࡍʹ
ਖ਼نදݱΛॻ͘ 3 ͜ͷ෦Λলུ͍ͨ͠
ීஈͲ͏ͬͯਖ਼نදݱΛॻ͘ʁ ͲΜͳਖ਼نදݱ͕ ཉ͍͠ͷ͔ʁ ༷ɾݴޠԽ 1 ςετέʔεΛ ߟ͑Δ 2 ࣮ࡍʹ
ਖ਼نදݱΛॻ͘ 3 ͜ͷ෦Λলུ͍ͨ͠ ϝʔϧΞυϨεʹϚον ͢Δਖ਼نදݱ͕ཉ͍͠ "
[email protected]
" "ex@
[email protected]
"
ઃఆ զʑͷٻΊΔͱ͜Ζ ʮਖ਼نදݱΛॻ͍ͯ͘ΕΔʯ ϓϩάϥϜ͕ཉ͍͠ ͦͷͨΊʹ͍࣋ͬͯΔͷ ͑Δͷ ཁٻ ࡶͳ༷ 1
ςετέʔε 2 ϝʔϧΞυϨεʹϚον ͢Δਖ਼نදݱ͕ཉ͍͠ "
[email protected]
" "ex@
[email protected]
"
৽ͨͳղܾࡦ ͷ֬ೝ ϩʔυϚοϓ τʔΫͷྲྀΕ 1 3 ੜ"* --. ཧతͳํ๏
1FSMͰ ؆୯ͳղܾࡦ 2 ʮਖ਼نදݱΛॻ͘ʯ ϓϩάϥϜ͕ ཉ͍͠ ࡶͳ ༷ ςετ έʔε ځ 2 ڀ
Regexp::Assemble 1FSMͰ w Regexp::Assembleͱ͍͏Ϟδϡʔϧ͕͋Δ w ෳͷจࣈྻਖ਼نදݱΛ·ͱΊͯͭͷਖ਼نදݱʹͰ͖Δ use Regexp::Assemble; my
$r = Regexp::Assemble->new; $r->add('
[email protected]
'); $r->add('
[email protected]
'); $r->add('
[email protected]
'); print $r->re; (?:aaa|bbb|ccc)@example.com
Regexp::Assembleͷ w ϧʔϓ +* ΛࣗಈͰ࡞ͬͯ͘Εͳ͍ w ʮϚονͯ͠΄͘͠ͳ͍ςετέʔεʯʹରԠ͍ͯ͠ͳ͍ use Regexp::Assemble;
my $r = Regexp::Assemble->new; $r->add('
[email protected]
'); $r->add('
[email protected]
'); $r->add('
[email protected]
'); print $r->re; [a-c]
[email protected]
ຊ͜͏ͳͬͯ΄͍͠
[email protected]
͜ΕΓ͗ͩ͢ͱ͍͑ͨ
৽ͨͳղܾࡦ ͷ֬ೝ ϩʔυϚοϓ τʔΫͷྲྀΕ 1 3 ੜ"* --. ཧతͳํ๏
1FSMͰ ؆୯ͳղܾࡦ Regexp::Assemble 2 ʮਖ਼نදݱΛॻ͘ʯ ϓϩάϥϜ͕ ཉ͍͠ ࡶͳ ༷ ςετ έʔε ځ 2 ڀ
ೳಈతΦʔτϚτϯֶश ཧతͳํ๏ 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
31/*ͷΞΠσΟΞ (1/4) ཧతͳํ๏ w ʮϚονͯ͠΄͍͠จࣈྻʯ͔ΒQSF fi YUSFFͷΦʔτϚτϯΛ࡞Δ 111, 000,
11101, 01 ε 1 1 11 111 0 01 00 000 1110 11101 1 1 0 1 0 0 1 0
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
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
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 Ϛονͯ͠΄͘͠ͳ͍ͷʹ Ϛονͯ͠͠·͏
31/*ͷΞΠσΟΞ (3/4) ཧతͳํ๏ w ʮϚονͯ͠΄͘͠ͳ͍จࣈྻʯΛຬͨ͢ʮ্ख͍ϚʔδʯΛ୳͢ ε 1 1 11
111 0 01 00 000 1110 11101 1 1 0 1 0 0 1 0 0, 1, 00, 01
31/*ͷΞΠσΟΞ (3/4) ཧతͳํ๏ w ʮϚονͯ͠΄͘͠ͳ͍จࣈྻʯΛຬͨ͢ʮ্ख͍ϚʔδʯΛ୳͢ ε 1 1 11
111 0 01 00 000 1110 11101 1 1 0 1 0 0 1 0 0, 1, 00, 01
31/*ͷΞΠσΟΞ (4/4) ཧతͳํ๏ w ʮ্ख͍ϚʔδʯΛ܁Γฦ͍ͯ͘͠ͱɺతͷΦʔτϚτϯ͕ಘΒΕΔ 0, 1, 00, 01
111, 000, 11101, 01 Ϛονͯ͠΄͍͠จࣈྻ Ϛονͯ͠΄͘͠ͳ͍จࣈྻ 0 0 0 1 1 1 (1ͷݸ-0ͷݸ)%3=0
31/*ͷ w ʮΦʔτϚτϯཧ͍͢͝ʂʯͱࢥ͑Δ͕ʜʜ
31/*ͷ w ʮΦʔτϚτϯཧ͍͢͝ʂʯͱࢥ͑Δ͕ʜʜ ΦʔτϚτϯ ਖ਼نදݱͰͳ͍
ΦʔτϚτϯͱਖ਼نදݱͷؔ େֶͷߨٛͷ෮श 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 ಡΊͳ͍ɾϝϯςͰ͖Μ
1FSMͷ࣮ ཧతͳՌແྗͳͷ͔ʜʜ
ʻݺΜͩʁ
͍ͬͦ"*ʹཔͬͯΈΔ ੜ"* --. w ʮϓϩάϥϜΛॻ͘ϓϩάϥϜʯͱݴ͑ੜ"* w ࣗવݴޠ͔ΒͦΕͬΆ͍ਖ਼نදݱΛ࡞ͬͯ͘Ε͍ͯ͢͝ ϝʔϧΞυϨεʹϚον ͢Δਖ਼نදݱ͕ཉ͍͠
/^\S+@\S+\.\S+$/
"*ʹཔͬͨͱ͖ͷ (1/2) ੜ"* --. w ςετέʔεΛຬ͍ͨͯ͠Δ͔ͷνΣοΫ ࣗͰ͢Δඞཁ͕͋Δ /^\S+@\S+\.\S+$/ "ex@
[email protected]
"
ʹϚονͯ͠͠·͏ʂ
"*ʹཔͬͨͱ͖ͷ (2/2) ੜ"* --. w 3F%P4 ਖ਼نදݱͷ੬ऑੑ ͷՄೳੑ͕͋Δ w ؔ࿈ݚڀ4JEEJRFUBM
6OEFSTUBOEJOH3FHVMBS&YQSFTTJPO%FOJBMPG4FSWJDF 3F%P4 *OTJHIUTGSPN--.(FOFSBUFE3FHFYFTBOE%FWFMPQFS'PSVNT *$1$ /^\S+@\S+\.\S+$/ "@." x 2048 . "\n" ͷϚονʹඵ͔͔Δ ⽘͘Β͍͕੬ऑ
3F%P4ͱ 3FHVMBS&YQSFTTJPO%FOJBMPG4FSWJDF w ਖ਼نදݱͱಛఆͷจࣈྻͷϚονΛ͢Δͱ͖ʹ ҟৗͳ͕͔͔࣌ؒͬͯ͠·͍ɺαʔϏεͷఏڙʹӨڹ͕ग़Δ੬ऑੑ $ time node -e
'/^(a|a)*$/.exec("a".repeat(29) + "b")' 34.65s user 0.26s system 99% cpu 35.249 total
3F%P4ͱ 3FHVMBS&YQSFTTJPO%FOJBMPG4FSWJDF w ਖ਼نදݱͱಛఆͷจࣈྻͷϚονΛ͢Δͱ͖ʹ ҟৗͳ͕͔͔࣌ؒͬͯ͠·͍ɺαʔϏεͷఏڙʹӨڹ͕ग़Δ੬ऑੑ w ৄ͘͠YAPC::Japan::OnlineͷࣗͷൃදΛ IUUQTTQFBLFSEFDLDPNNBLFOPXKVTUTUBUFPGUIFBSUPG SFEPTEFUFDUJPOFEBEFDDFCBBE
SFEPTSFDIFDL ࠓ͙͢ݕࡧʂ
1FSMͷ࣮μ ϝɺཧμ ϝɺ ੜ"*μ ϝ ͳΒɺͲ͏͢Ε͍͍Μͩ
࣮ཧͦΜͳʹγϣϘ͘ͳ͍ w ਖ਼نදݱͷ߹ TZOUIFTJ[F ɾम෮ SFQBJS ͱ͍͏͕ ͱͯ׆ൃʹݚڀ͞Ε͍ͯΔ w ਖ਼نදݱͷ߹ɾम෮ςετέʔεΛຬͨ͢ਖ਼نදݱΛͭ͘Δ
w ؔ࿈ݚڀ<1BOFUBM 0014-"> <-JFUBM "4&> <-JFUBM 64&/*9> <$IJEB5FSBVDIJ 41> <$IJEB5FSBVDIJ 1-%*> <4VOHFUBM > ʜʜ
࣮ཧͦΜͳʹγϣϘ͘ͳ͍ w ਖ਼نදݱͷ߹ TZOUIFTJ[F ɾम෮ SFQBJS ͱ͍͏͕ ͱͯ׆ൃʹݚڀ͞Ε͍ͯΔ w ਖ਼نදݱͷ߹ɾम෮ςετέʔεΛຬͨ͢ਖ਼نදݱΛͭ͘Δ
w ؔ࿈ݚڀ<1BOFUBM 0014-"> <-JFUBM "4&> <-JFUBM 64&/*9> <$IJEB5FSBVDIJ 41> <$IJEB5FSBVDIJ 1-%*> <4VOHFUBM > ʜʜ
ਖ਼نදݱͷ߹ɾम෮ͷΞΠσΟΞ w ਖ਼نදݱͷςϯϓϨʔτΛ୳ࡧͰվྑ͍ͯ͘͠ w ਖ਼نදݱͷςϯϓϨʔτϋί˘ΛؚΉ ϋί˘ͲΜͳਖ਼نදݱͰೖΕΔ͜ͱ͕Ͱ͖Δ݀ ϓϨʔεϗϧμʔ w ϋί˘ʹจࣈΫϥεΛೖΕͯ
ςετέʔεΛຬ͔ͨ͢Ͳ͏͔ΛνΣοΫ͢Δ w μϝͳ߹ɺϋί˘Λ͞Βʹ۩ମతͳਖ਼نදݱͰஔ͖͑ͯ୳ࡧ <$IJEB5FSBVDIJ 41> <$IJEB5FSBVDIJ 1-%*>
ਖ਼نදݱͷ߹ɾम෮ͷྫ (1/7) ab, cd, abab, ccdd ac, bc, ad,
bd Ϛονͯ͠΄͍͠จࣈྻ Ϛονͯ͠΄͘͠ͳ͍จࣈྻ ୳ࡧΩϡʔ •/□/ ॳظঢ়ଶ
ਖ਼نදݱͷ߹ɾम෮ͷྫ (2/7) ab, cd, abab, ccdd ac, bc, ad,
bd Ϛονͯ͠΄͍͠จࣈྻ Ϛονͯ͠΄͘͠ͳ͍จࣈྻ ୳ࡧΩϡʔ •/□/ ϋί˘ͭʹ จࣈΫϥεΛೖΕΔ͚ͩͰ ςετέʔεΛຬͨ͢ͷ ϜϦ
ਖ਼نදݱͷ߹ɾम෮ͷྫ (3/7) ab, cd, abab, ccdd ac, bc, ad,
bd Ϛονͯ͠΄͍͠จࣈྻ Ϛονͯ͠΄͘͠ͳ͍จࣈྻ ୳ࡧΩϡʔ •/□|□/ •/□□/ •/□*/ ϋί˘ΛΑΓ۩ମతͳ ਖ਼نදݱʹஔ͖͑ͯ ୳ࡧΩϡʔʹՃ
ਖ਼نදݱͷ߹ɾम෮ͷྫ (4/7) ab, cd, abab, ccdd ac, bc, ad,
bd Ϛονͯ͠΄͍͠จࣈྻ Ϛονͯ͠΄͘͠ͳ͍จࣈྻ ୳ࡧΩϡʔ •/□|□/ •/□□/ •/□*/ /□|□//□□/ จࣈΫϥεΛೖΕͯ ςετέʔεΛຬͨ͢ͷ ϜϦ
ਖ਼نදݱͷ߹ɾम෮ͷྫ (5/7) ab, cd, abab, ccdd ac, bc, ad,
bd Ϛονͯ͠΄͍͠จࣈྻ Ϛονͯ͠΄͘͠ͳ͍จࣈྻ ୳ࡧΩϡʔ •/□|□/ •/□□/ •/□*/ /[a-d]*/ͱ͢Δͱ Ұݟ͍͚ͦ͏͕ͩ Ϛονͯ͠΄͘͠ͳ͍ จࣈྻʹϚονͯ͠͠·͏
ਖ਼نදݱͷ߹ɾम෮ͷྫ (6/7) ab, cd, abab, ccdd ac, bc, ad,
bd Ϛονͯ͠΄͍͠จࣈྻ Ϛονͯ͠΄͘͠ͳ͍จࣈྻ ୳ࡧΩϡʔ •/□*|□*/ •/□*□*/ •… ࠶ɺϋί˘Λ ۩ମతͳਖ਼نදݱʹ ஔ͖͑ͯ୳ࡧ
ਖ਼نදݱͷ߹ɾम෮ͷྫ (7/7) ab, cd, abab, ccdd ac, bc, ad,
bd Ϛονͯ͠΄͍͠จࣈྻ Ϛονͯ͠΄͘͠ͳ͍จࣈྻ ୳ࡧΩϡʔ •/□*|□*/ •/□*□*/ •… /[ab]*|[cd]*/ͱ͢Δ ͜ͱͰతͷਖ਼نදݱʹʂ
ϋί˘ͷຒΊํ 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)
4"5ιϧόΛ͏ͱ͍͍͜ͱ w ୯ʹϋί˘ʹจࣈΫϥεΛຒΊΔ͚ͩͰͳ͘ɺ Ճͷ੍ΛೖΕΔ͜ͱͰ༷ʑͳʹରԠͰ͖Δ w ྫ͑ɺذ|܁Γฦ͠*͕ᐆດʹͳΒͳ͍ a|aͷΑ͏ͳɺࠨӈͲͪΒͰBͰϚονͯ͠͠·͏͜ͱ͕ͳ͍ ͱ͍͏੍ΛೖΕΔ͜ͱͰɺ3F%P4͕ى͜Βͳ͍͜ͱ͕อূͰ͖Δ
<$IJEB5FSBVDIJ 41> <$IJEB5FSBVDIJ 1-%*> ˘c<BC> 3F%P4ରࡦ੍ □1 ≠ a ∧ □1 ≠ b ˘c˘ □1 ≠ □2
ϋί˘Λͬͨํ๏ͷ w ϋί˘͔ͭΒ࢝ΊΔͱɺతͷਖ਼نදݱʹḷΓண͘·Ͱʹ ͱ͕͔͔ͯ࣌ؒΔ w ςετέʔεΛຬͨ͢࠷খͷਖ਼نදݱΛ୳͢ /1IBSEͰ͋Δ͜ͱ͕ΒΕ͍ͯΔ ˘ ˘
˘c˘ ˘˘ ˘c˘ ˘˘ ˘˘˘ ˘c˘ ˘ ˘ ˘c˘ ˘ ˘ ʜʜ
࿕ใ࣮ϋί˘͔ͭΒ ࢝Ίͳͯ͘ྑ͍ ਖ਼نදݱͷम෮ SFQBJS ΞϧΰϦζϜͰ͋ΔͷͰ
ʮ࠷ॳͷਖ਼نදݱʯ͕͋Ε͍͍ ਖ਼نදݱͷम෮ SFQBJS w ϋί͔ͭΒ࢝ΊΔΘΓʹʮ࠷ॳͷਖ਼نදݱʯΛ༩͑Δ͜ͱ͕Ͱ͖Δ w ʮ࠷ॳͷਖ਼نදݱʯͷจࣈɾจࣈΫϥεͷ෦Λ ϋί˘Ͱஔ͖͍͑ͯ͘͜ͱͰɺతͷਖ਼نදݱʹ͍͍ۙͯ͘ /^\S+@\S+\.\S+$/
/^□+@□+\.□+$/ /^[^@]+@[^.@]+\.[^@]+$/
ʮ࠷ॳͷਖ਼نදݱʯΛ "*ʹॻ͔ͤΕ͍͍ͷͰʁ
৽ͨͳղܾࡦ ͷ֬ೝ ϩʔυϚοϓ τʔΫͷྲྀΕ 1 3 ੜ"* --. ཧతͳํ๏
1FSMͰ ؆୯ͳղܾࡦ Regexp::Assemble RPNI ReDoSͳͲͷ 2 ʮਖ਼نදݱΛॻ͘ʯ ϓϩάϥϜ͕ ཉ͍͠ ࡶͳ ༷ ςετ έʔε ੜAI (LLM) Ͱ ʮ࠷ॳͷਖ਼نදݱʯ Λੜ ਖ਼نදݱͷम෮ ΞϧΰϦζϜ ځ 2 ڀ
ϘΫ͕ߟ͑ͨ࠷ڧͷʮਖ਼نදݱΛॻ͍ͯ͘ΕΔʯ γεςϜͷΠϝʔδਤ ͜͏͍͏ ਖ਼نදݱ͕ ཉ͍͠ ͜͏͍͏จࣈྻʹ Ϛονͯ͠ ΄͍͠ɾ΄͘͠ͳ͍ ਖ਼نදݱम෮
ΞϧΰϦζϜ ੜ"* ࠷ॳͷਖ਼نදݱ తͷਖ਼نදݱ ࣗવݴޠʹΑΔ༷ ςετέʔε
Ͱɺ࣮ʁ
Ӷҙɺ࡞த ؒʹ߹͍·ͤΜͰͨ͠ʜʜ
࣮͕ؒʹ߹Θͳ͔ͬͨཧ༝ ݴ͍༁ w ਖ਼نදݱͷम෮ͷݚڀ <$IJEB5FSBVDIJ 41> <$IJEB5FSBVDIJ 1-%*> ͷ࣮ͷιʔείʔυ͕ެ։͞Ε͍ͯͳ͍ ࣮ݧΛ࠶ݱ͢ΔͨΊͷԾڥͷΠϝʔδ͚ͩ͋Δ
w ݱ࣮ੈքͷਖ਼نදݱʹ͑ΔͨΊͷύʔαจࣈΫϥεͷ࣮͕େม w ࠷͔ۙͬͨ͠ υΠπʹߦͬͨΓΠϯυʹߦͬͨΓ͍ͯͨ͠ IUUQTHJUIVCDPNTQPOTPSTNBLFOPXKVTU (JU)VCεϙϯαʔืूத
͔͑ͨͬͨ͜ͱ ·ͱΊ w ੜ"*ʹਖ਼نදݱΛॻ͔ͤΔͷ͍͍͚Ͳɺ3F%P4͕ى͜Βͳ͍͔ɺ ຊʹతͷจࣈྻʹϚον͢Δɾ͠ͳ͍͔νΣοΫ͠Α͏ʂ
͔͑ͨͬͨ͜ͱ ·ͱΊ w ੜ"*ʹਖ਼نදݱΛॻ͔ͤΔͷ͍͍͚Ͳɺ3F%P4͕ى͜Βͳ͍͔ɺ ຊʹతͷจࣈྻʹϚον͢Δɾ͠ͳ͍͔νΣοΫ͠Α͏ʂ w ҰൠͷϓϩάϥϜͩͱˢͷ͜ͱಓʹΔ͔͠ͳ͍ ͚ΕͲɺਖ਼نදݱͳΒ৭ʑͱݚڀ͕͞Ε͍ͯΔͷͰɺ ཧతʹղܾͰ͖Δ͜ͱ͋Δ
͔͑ͨͬͨ͜ͱ ·ͱΊ w ੜ"*ʹਖ਼نදݱΛॻ͔ͤΔͷ͍͍͚Ͳɺ3F%P4͕ى͜Βͳ͍͔ɺ ຊʹతͷจࣈྻʹϚον͢Δɾ͠ͳ͍͔νΣοΫ͠Α͏ʂ w ҰൠͷϓϩάϥϜͩͱˢͷ͜ͱಓʹΔ͔͠ͳ͍ ͚ΕͲɺਖ਼نදݱͳΒ৭ʑͱݚڀ͕͞Ε͍ͯΔͷͰɺ ཧతʹղܾͰ͖Δ͜ͱ͋Δ w
ָ͍͠ਖ਼نදݱϥΠϑΛʂ
͔͜͜Β࣭ٙԠ༻
31/*ͷྫͰग़͖ͯͨਖ਼نදݱ w ࣮ࡍʹͬͱ͍ͷʹͰ͖Δ w ͕ɺͦΕʹৄࡉͳΦʔτϚτϯͷߏͷੳ͕ඞཁͰɺ ػցతʹΔͷ؆୯Ͱͳ͍ ͱࢥ͏ 0 0
0 1 1 1 /\A(0(01)*(1|00)|1(10)*(0|11))*\z/ (1ͷݸ-0ͷݸ)%3=0
ݱ࣮ͷਖ਼نදݱʹͲͷఔରԠͰ͖Δʁ w ઌߦݚڀ<$IJEB5FSBVDIJ 41> <$IJEB5FSBVDIJ 1-%*> ࣮ੈքͷਖ਼نදݱΛରʹ͍ͯ͠Δ w ͭ·ΓઌಡΈɾޙಡΈޙํࢀরΛؚΉਖ਼نදݱʹରͯ͠ ͪΌΜͱಈ࡞͢ΔΑ͏ʹͳ͍ͬͯΔ
w ͞ΒʹɺςετέʔεʹΩϟϓνϟͷใ·ͰೖΕΔͱɺ ͦ͜·Ͱߟྀͨ͠ਖ਼نදݱΛ࡞Δ͜ͱ͕Ͱ͖Δ
"*ʹΑΔʮ࠷ॳͷਖ਼نදݱʯͱम෮ͷίετ w ʮ࠷ॳͷਖ਼نදݱʯΛ༩͑ͨ߹Ͱɺ ͱͯ͠/1IBSEͰ͋Δ͜ͱมΘΒͳ͍ w తͷਖ਼نදݱʹ͚ۙΕ͍ۙ΄Ͳ୳ࡧૣ͘ऴΘΔͷͰɺ "*ͰͳΔ͘తͷͷʹ͍ۙʮ࠷ॳͷਖ਼نදݱʯ͕ಘΒΕΕɺ म෮ΞϧΰϦζϜૣ͍ஈ֊ͰऴΘΔͣɺͱ͍͏ظ͕͋Δ
ݱࡏͷਐḿঢ়گ w ༷ʑͳਖ਼نදݱ࣮ +BWB4DSJQU 1FSM 3VCZ 1ZUIPO /&5 ʹରԠͰ͖Δ ਖ਼نදݱͷύʔαͰ͖͍ͯΔ
w จࣈΫϥεͳͲͷࡉ͔ͳڍಈ͕·࣮ͩͰ͖͓ͯΒͣɺ म෮ΞϧΰϦζϜͷ࣮͕࢝ΊΒΕ͍ͯͳ͍ w म෮ΞϧΰϦζϜࣗମͦ͜·Ͱେม͡Όͳͦ͞͏