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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
940
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
870
開発者(個人)のためのJenkins 運用編
yasuhiroki
0
2.4k
Other Decks in Technology
See All in Technology
2026_devsumi_ozono.pdf
o3
2
330
AIで実装は速くなった。なのにプロダクトは速くならない。職能の壁を越えて価値のフローを設計する
nwiizo
8
7.8k
10分で知る最近のOmarchy
komagata
0
240
コーディングエージェントでM5Stack系の開発を少し試した時の話 / M5 Japan Tour 2026 Autumn 東京
you
PRO
0
140
20260912_スクラムにジェネラリストは必要か
ryugen04
0
310
『止めない』を設計する — 制約の中で、事業の根幹を支える判断
hiroyaterui
0
260
Screen Lens - 今見てる画面を翻訳する
komagata
0
240
synctest時代のhttptest Go 1.27で変わるHTTPサーバテストの裏側 / go conference2026 synctest and httptest
budougumi0617
1
2.6k
Deploying a Full-Stack Bun-Native Framework on Cloudflare Workers
7nohe
0
130
Webとヘルスデータ
yukukotani
1
370
コスト最適化の「めんどくさい」を AWS FinOps Agent でチョット楽にする
classmethod_kaz
0
300
#jawssonic2026 あの時代が悪かった ~動かなかったSageMakerと共に迎えたイベント当日~
ktkn1129
0
140
Featured
See All Featured
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
370
The Spectacular Lies of Maps
axbom
PRO
1
990
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Automating Front-end Workflow
addyosmani
1369
210k
How to build a perfect <img>
jonoalderson
1
6k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Done Done
chrislema
186
16k
So, you think you're a good person
axbom
PRO
2
2.1k
Evolving SEO for Evolving Search Engines
ryanjones
0
280
We Are The Robots
honzajavorek
0
360
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
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)
͋Γ͕ͱ͏͍͟͝·ͨ͠