Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Rubyの正規表現を調べてみた
Search
Yasuhiroki
September 26, 2018
Technology
1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rubyの正規表現を調べてみた
調べてみた系の発表です。
Yasuhiroki
September 26, 2018
More Decks by Yasuhiroki
See All by Yasuhiroki
自分に勉強させるには
yasuhiroki
1
470
Android Studio `Command+Shift+A`
yasuhiroki
0
400
シェルスクリプトをサーバーレスで cron したい
yasuhiroki
1
950
rails new コマンド
yasuhiroki
1
860
自動化を習慣化する
yasuhiroki
2
15k
GitHub Actions Parallel Testing
yasuhiroki
1
1.4k
circleci.vim
yasuhiroki
0
1.9k
ベンチャー企業がCircleCIを選んだ理由と活用方法
yasuhiroki
1
880
開発者(個人)のためのJenkins 運用編
yasuhiroki
0
2.4k
Other Decks in Technology
See All in Technology
AIは推し活である。
kurazuuuuuu
1
930
その Lambda、8分で 管理者権限まで奪われます
k1nakayama
7
3.5k
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
12k
`t*(42&t>>10)`だけで音楽が鳴る、Swiftで実装するBytebeat / iOSDC Japan 2026
yutailang0119
0
130
AI 時代のスタートアップエコシステ厶から考究する技術的負債との向き合い方
m3m0r7
PRO
3
2.5k
Slack上でインフラをトラブルシュートする! Agentic Platform Engineeringの第一歩
teru0x1
5
1.8k
.NET WebAssemblyで実現するクライアントサイドAI推論:NuGetからViteまで、2つのエコシステムを繋ぐビルド戦略
yamachu
0
420
AI時代、データエンジニアが一番おもろい
genshun9
0
680
負債のメタファと2026年 / Debt Metaphor in Agentic Engineering Age 202609 Edition
twada
PRO
10
4.8k
すぐできる衛星通信対応 あとは山奥に行くだけ
tatetate55
0
140
サーバーレスをどこまで使う? WebRTC対戦ゲームで選んだVPSとの共存設計
kaidouji85
0
300
AIに任せた品質は、誰が見立てるのか - AI時代のテストマネジメント
nakanao
3
2.7k
Featured
See All Featured
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.1k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
470
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
370
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
430
Game over? The fight for quality and originality in the time of robots
wayneb77
1
290
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
700
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
30 Presentation Tips
portentint
PRO
1
400
Transcript
Ruby ͷ ਖ਼نදݱΛௐͯΈͨ @yasuhiroki (tw: @duck_ysauhiroki)
ࣗݾհ • Yasuhiroki (Twitter: @duck_yasuhiroki) • ΤʔςϯϥϘגࣜձࣾ • αʔόʔαΠυΤϯδχΞ •
AWS • Ruby on Rails • ͨ·ʹ Android ͬͯΔ
ൃද༰ͷ͖͔͚ͬ
ϋογϡλάΛൈ͖ग़͍ͨ͠ $ cat text λά #λά ##λά# ## #ά#͙ͨ##tag g
λά #ͨ# #͙ͨ # #λάɹ#͙ͨ #
ϋογϡλάΛൈ͖ग़͍ͨ͠ $ cat text #͙ͨ # #λάɹ#͙ͨ # $ cat
text | ruby -ne 'p $_.scan(/????/)’ ["#͙ͨ", "#λά", "#͙ͨ", "#"]
ϋογϡλάΛൈ͖ग़͍ͨ͠ $ cat text #͙ͨ # #λάɹ#͙ͨ # $ cat
text | ruby -ne 'p $_.scan(/#[^#\s]+/)’ ["#͙ͨ", "#λάɹ", "#͙ͨ", “#"] શ֯εϖʔε͕औΓআ͚ͳ͍ʂ
ϋογϡλάΛൈ͖ग़͍ͨ͠ $ cat text | ruby -ne 'p $_.scan(/#[^#\s]+/)’ ["#͙ͨ",
"#λάɹ", "#͙ͨ", "#"] શ֯εϖʔε͕औΓআ͚ͳ͍ $ cat text | \ ruby -ne 'p $_.scan(/#[^#[:space:]+/)’ ["#͙ͨ", "#λά", "#͙ͨ", "#"] ͬͪ͜ͳΒΦοέʔ
\s ͱ [:space:] ԿͰҧ͏ͷʁ
Rubyͷਖ਼نදݱΛௐͯΈͨ
ൃදͷલఏ • RubyϫΧϧ • ਖ਼نදݱνϣοτγοςϧ • /Ebisu\.rb#\d+/ ͘Β͍ϫΧϧ • (ͪͳΈʹ)
“Ebisu.rb#18” ʹϚον͠·͢
Rubyͷਖ਼نදݱΛௐͯΈͨ
Rubyͷਖ਼نදݱΤϯδϯ • َӢ https://github.com/k-takata/Onigmo/ • Ruby ͷਖ਼نදݱΤϯδϯ • Ruby 2.0
͔Β࠾༻ • PerlͰΘΕ͍ͯΔʁ • ଞͰΘΕ͍ͯͳ͍ʁ
Ruby ͷਖ਼نදݱ • ௐͯʮ͓ͬʯͱࢥͬͨͷΛϐοΫΞοϓ • Character Property • ෦ࣜݺͼग़͠ •
ඇแؚԋࢉࢠ • ઌಡΈɺޙಡΈ
Ruby ͷਖ਼نදݱ • ௐͯʮ͓ͬʯͱࢥͬͨͷΛϐοΫΞοϓ • Character Property • ෦ࣜݺͼग़͠ •
ඇแؚԋࢉࢠ • ઌಡΈɺޙಡΈ
Character Property • \p{} Ͱ Unicode ͷ Character Property Λࢦఆ
Ͱ͖Δ • ͻΒ͕ͳɺΧλΧφɺࣈɺֆจࣈɺಛघͳ จࣈ ͍Ζ͍ΖϚονͰ͖Δ
ͻΒ͕ͳɾΧλΧφʹϚον "ΈΜνϟϨ".match(/\p{Hiragana}+/) => #<MatchData “ΈΜ"> "ΈΜνϟϨ".match(/\p{Katakana}+/) => #<MatchData “νϟϨ">
ֆจࣈʹϚον "͙ʔͺΜͪ".match(/\p{Emoji}/) => #<MatchData "">
৭͖ֆจࣈʹϚον "͙ʔ$ͺΜͪ".match(/\p{Emoji}/) => #<MatchData ""> ৭͕ണ͕Εͯ͠·͏ "͙ʔ$ͺΜͪ".match(/\p{Emoji}\p{Emoji_Modifier}/) #=> #<MatchData "$">
৭(skin)ࢦఆ͢ΕOK
ٽ͔ͳ͍Ͱ… (´°̥̥̥ω°̥̥̥ʆ) "(´° ̥ ̥̥ω° ̥ ̥̥ʆ)".gsub(/\p{Combining_Mark}/, '') => “(´°ω°ʆ)"
݁߹จࣈΛۭจࣈʹม͢ΕྦΛ১͍ڈΕΔʂ
Ruby ͷਖ਼نදݱ • ௐͯʮ͓ͬʯͱࢥͬͨͷΛϐοΫΞοϓ • Character Property • ෦ࣜݺͼग़͠ •
ඇแؚԋࢉࢠ • ઌಡΈɺޙಡΈ
෦ࣜݺͼग़͠ • \g{name} άϧʔϓͷࣜͦͷͷΛݺͼग़͢ • \1, \2 ͷΑ͏ͳޙํࢀরͱҧ͏
໋ྩ͞Ε͍ͯΔϝϩε “ΕϝϩεౖΕϝϩε伻Εϝϩε” .match(/(.Εϝϩε)\g<1>\g<1>/) => #<MatchData "ΕϝϩεౖΕϝϩε伻Εϝϩε" 1:”伻Εϝϩε "> (.Εϝϩε)\g<1>\g<1>ɹ (.Εϝϩε)(.Εϝϩε)(.Εϝϩε)
ͱಉ͡ “Εϝϩε৸Δϝϩε伻Εϝϩε" .match(/(.Εϝϩε)\g<1>\g<1>/) => nil
Ruby ͷਖ਼نදݱ • ௐͯʮ͓ͬʯͱࢥͬͨͷΛϐοΫΞοϓ • Character Property • ෦ࣜݺͼग़͠ •
ඇแؚԋࢉࢠ • ઌಡΈɺޙಡΈ
ඇแؚԋࢉࢠ • (?~) ͰจࣈྻΛؚ·ͳ͍͕දݱͰ͖Δ • (?~abc) จࣈྻ abc Λؚ·ͳ͍ͷҙ •
ab ac ڐ͢ • ࢀߟ [^abc] a, b, c ͷ͍ͣΕͷจࣈؚ·ͳ͍ͷҙ • ab ac ڐ͞ͳ͍
ίϝϯτΞτͷநग़ "/* ͜͜ͷ࣮࠷ѱͰ͢(*^o^*)/ */" .match(%r{/\*(?~\*/)\*/}) => #<MatchData "/* ͜͜ͷ࣮࠷ѱͰ͢(*^o^*)/ */">
"/* ͜͜ͷ࣮࠷ѱͰ͢(*^o^*)/ */" .match(%r{/\*[^\*]*\*+(([^\*/][^\*]*)\*+)*/}) => #<MatchData "/* ͜͜ͷ࣮࠷ѱͰ͢(*^o^*)/ */" 1:")/ *" 2:")/ "> (?~) ΛΘͳ͍ͱͪΐͬͱେม ※ https://qiita.com/k-takata/items/4e45121081c83d3d5bfd
Ruby ͷਖ਼نදݱ • ௐͯʮ͓ͬʯͱࢥͬͨͷΛϐοΫΞοϓ • Character Property • ෦ࣜݺͼग़͠ •
ඇแؚԋࢉࢠ • ઌಡΈɺޙಡΈ
ઌಡΈɺޙಡΈ • (?=) (?<=) ͳͲ • Ϛον͢Δ݅ʹࢦఆ͢Δ͚Ͳ Ϛονͨ݁͠ՌʹؚΊͨ͘ͳ͍࣌ʹ͏ •
͍ํʹΑͬͯANDͬΆ͑͘Δ
ܙൺणͷ൪ͷΈऔಘ "౦ژौ୩۠ܙൺण1-8-5 ౦༸Ϗϧ 3֊" .match(/(?<=ܙൺण)\S+/) => #<MatchData "1-8-5">
౦ژͷौ୩ͷܙൺणͷ͚࣌ͩϚον "౦ژौ୩۠ܙൺण1-8-5 ౦༸Ϗϧ 3֊" .match(/(?=.*౦ژ)(?=.*ौ୩)(?=.*ܙൺण).*/) => #<MatchData "౦ژौ୩۠ܙൺण1-8-5 ౦༸Ϗϧ 3֊">
"ژौ୩۠ܙൺण1-8-5 ౦༸Ϗϧ 3֊" .match(/(?=.*౦ژ)(?=.*ौ୩)(?=.*ܙൺण).*/) => nil ژͩͱϚον͠ͳ͍
͓·͚ • \s ͱ [:space:] ͕ҧ͏ཧ༝ΛௐͯΈͨ
َӢͷυΩϡϝϯτͰʁ • \s • 0009, 000A, 000B, 000C, 000D, 0085(NEL)
• Line_Separator, Paragraph_Separator, Space_Separator • [:space:] • 0009, 000A, 000B, 000C, 000D, 0085(NEL) • Line_Separator, Paragraph_Separator, Space_Separator
َӢͷυΩϡϝϯτͰʁ • \s • 0009, 000A, 000B, 000C, 000D, 0085(NEL)
• Line_Separator, Paragraph_Separator, Space_Separator • ASCII֎ͷจࣈΛؚΉ͔Ͳ͏͔ ONIG_OPTION_ASCII_RANGE Φϓγϣϯʹґଘ ͢Δɻ • [:space:] • 0009, 000A, 000B, 000C, 000D, 0085(NEL) • Line_Separator, Paragraph_Separator, Space_Separator • ASCII֎ͷจࣈʹϚον͢Δ͔Ͳ͏͔ ONIG_OPTION_ASCII_RANGE Φϓγϣϯ ͱ ONIG_OPTION_POSIX_BRACKET_ALL_RANGE Φϓγϣϯʹґଘ͢Δɻ
จࣈू߹Φϓγϣϯʹώϯτ͕ • d: σϑΥϧτ (Ruby 1.9.3 ޓ) \w, \d, \s
ɺඇASCIIจࣈʹϚον͠ͳ͍ɻ POSIXϒϥέοτɺ֤ΤϯίʔσΟϯάͷϧʔϧʹै ͏ɻ • u: Unicode ONIG_OPTION_ASCII_RANGEΦϓγϣϯ͕ΦϑʹͳΔɻ \w (\W), \d (\D), \s (\S), \b (\B), POSIXϒϥέοτɺ֤Τ ϯίʔσΟϯάͷϧʔϧʹै͏ɻ
\s ͱ [:space:] ͷڍಈ • σϑΥϧτ • \s: ASCIIจࣈͷΈର •
[:space:]: ASCIIจࣈҎ֎ର
จࣈू߹ΦϓγϣϯΛࢦఆ͢Δͱʁ "#λάɹ".scan(/(?u)#[^#\s]+/) => ["#λά"] \sͰશ֯εϖʔεΛѻ͑Δ
ࢀߟ • [ਖ਼نදݱ](https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html) • [RegexpΫϥε](https://docs.ruby-lang.org/ja/latest/class/Regexp.html) • [Emoji Properties](http://unicode.org/reports/tr51/#Emoji_Properties) • [َӢ](https://github.com/k-takata/Onigmo/)
• [َӢʹඇแؚΦϖϨʔλΛ࣮ͨ͠](https://qiita.com/k-takata/items/ 4e45121081c83d3d5bfd) • [ਖ਼نදݱϝϞ](http://www.kt.rim.or.jp/~kbk/regex/regex.html)
͋Γ͕ͱ͏͍͟͝·ͨ͠