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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
TSUYUSATO Kitsune
November 13, 2025
Programming
1.5k
1
Share
「正規表現をつくる」をつくる / make "make regex"
YAPC::Fukuoka 2025での発表『「正規表現をつくる」をつくる』のスライドです。
TSUYUSATO Kitsune
November 13, 2025
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
62
Regular Expressions, REXML, Automata Learning
makenowjust
0
440
オートマトン学習しろ / Do automata learning
makenowjust
3
570
#kaigieffect LT 2024 - rexml-css_selector: A REXML extension for supporting CSS selector
makenowjust
1
450
RubyKaigi 2024 - Make Your Own Regex Engine!
makenowjust
1
2.1k
正規表現改善報告する回 / Regexp memoization progress report
makenowjust
2
710
Make Regexp#match much faster
makenowjust
1
3k
Other Decks in Programming
See All in Programming
「速くなった気がする」をデータで疑う
senleaf24
0
130
Go_College_最終発表資料__外部公開用_.pdf
xe_pc23
0
120
20260313 - Grafana & Friends Taipei #1 - Kubernetes v1.36 的開發雜記:那些困在 Alpha 加護病房太久的 Metrics
tico88612
0
250
KagglerがMixSeekを触ってみた
morim
0
370
RSAが破られる前に知っておきたい 耐量子計算機暗号(PQC)入門 / Intro to PQC: Preparing for the Post-RSA Era
mackey0225
3
120
AI駆動開発がもたらすパラダイムシフト
ryosuke0911
0
110
Goの型安全性で実現する複数プロダクトの権限管理
ishikawa_pro
2
1.4k
Nuxt Server Components
wattanx
0
240
事業会社でのセキュリティ長期インターンについて
masachikaura
0
230
Codex CLIのSubagentsによる並列API実装 / Parallel API Implementation with Codex CLI Subagents
takatty
2
820
SkillがSkillを生む:QA観点出しを自動化した
sontixyou
5
2.4k
Vibe하게 만드는 Flutter GenUI App With ADK , 박제창, BWAI Incheon 2026
itsmedreamwalker
0
200
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.2k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
Speed Design
sergeychernyshev
33
1.6k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
420
How to Ace a Technical Interview
jacobian
281
24k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
How to Talk to Developers About Accessibility
jct
2
170
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.8k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.4k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
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 म෮ΞϧΰϦζϜࣗମͦ͜·Ͱେม͡Όͳͦ͞͏