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
TSUYUSATO Kitsune
November 13, 2025
Programming
1.6k
1
Share
「正規表現をつくる」をつくる / make "make regex"
YAPC::Fukuoka 2025での発表『「正規表現をつくる」をつくる』のスライドです。
TSUYUSATO Kitsune
November 13, 2025
More Decks by TSUYUSATO Kitsune
See All by TSUYUSATO Kitsune
(Re)make Regexp in Ruby: Democratizing internals for the JIT
makenowjust
3
1.1k
最近の研究とか、RubyへのContributionとか / Recent My Study and Ruby Contributions
makenowjust
2
300
Make Parsers Compatible Using Automata Learning
makenowjust
3
13k
YAPC::Japan::Online 2022で発表して WEB+DB PRESSに記事を寄稿した話
makenowjust
0
68
Regular Expressions, REXML, Automata Learning
makenowjust
0
460
オートマトン学習しろ / Do automata learning
makenowjust
3
590
#kaigieffect LT 2024 - rexml-css_selector: A REXML extension for supporting CSS selector
makenowjust
1
460
RubyKaigi 2024 - Make Your Own Regex Engine!
makenowjust
1
2.2k
正規表現改善報告する回 / Regexp memoization progress report
makenowjust
2
720
Other Decks in Programming
See All in Programming
PHPでローカル環境用のSSL/TLS証明書を発行することはできるのか? #phpconkagawa
akase244
0
370
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
1
110
AI Agent と正しく分析するための環境作り
yoshyum
2
510
属人化しないコード品質の作り方_2026.04.07.pdf
muraaano
1
360
KMP × Kotlin 2.3 - How Android Got Slower While iOS Builds Improved by 47%
rio432
0
200
開発とはなにか、Essenceカーネルで見えるもの
ukin0k0
0
170
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
390
Sans tests, vos agents ne sont pas fiables
nabondance
0
130
Spec-Driven Development with AI Agents (Workshop, May 2026)
antonarhipov
3
360
[RubyKaigi 2026] Require Hooks
palkan
1
320
密結合なバックエンドから TypeScript のコードを生成する
kemuridama
0
140
運転動画を検索可能にする〜Cosmos-Embed1とDatabricks Vector Searchで〜/cosmos-embed1-databricks-vector-search
studio_graph
3
950
Featured
See All Featured
The Language of Interfaces
destraynor
162
26k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
260
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
It's Worth the Effort
3n
188
29k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
How to make the Groovebox
asonas
2
2.2k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
Art, The Web, and Tiny UX
lynnandtonic
304
21k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
310
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
800
Balancing Empowerment & Direction
lara
6
1.1k
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 म෮ΞϧΰϦζϜࣗମͦ͜·Ͱେม͡Όͳͦ͞͏