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
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
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
みてねにおけるAI-DLC導入活動とAIドリブン開発の現在地/JAWS-UG AI-DLC #2
isaoshimizu
2
270
Windows の互換機能 - 古いプログラムはなぜ動作できるのか
murachiakira
PRO
0
120
信頼性はSREだけのものじゃない
hkawaras
0
290
ClaudeCodeでセキュリティ監視業務を半自動化_1年の運用でわかったAIに任せる設計の5つのポイント
kintotechdev
3
890
dbt in Microsoft Fabric
ryomaru0825
0
300
APIセキュリティを組織で実現するには~注力する点と設計・実装に入れたい対策~
riiimparm
2
710
暗号化?某ファイルストレージはどうなるの!? 3rd Partyとうまく付き合う秘密度ラベル設計
kasada
0
210
IHV like なユースケースへのOpenID Connect 関連仕様の適用事例
optim
0
350
エージェント化するAI:現在地とその先に起きる変化 / AI as Agents: The Current State and the Changes Ahead
ks91
PRO
0
150
マイナンバーカード本人確認の実装比較(OAuth/OIDC Numa (Immersion) Workshop 2026) / 20260825 numa-12
oidfj
PRO
0
330
Claude Teamプランの コスト最適化を考える
rfdnxbro
0
800
「面白い!」を信じ抜け。激動の時代を貫く、オンリーワン・エンジニアの条件
kizawa2020
1
380
Featured
See All Featured
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
We Are The Robots
honzajavorek
0
310
Code Review Best Practice
trishagee
74
20k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
430
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
830
Ruling the World: When Life Gets Gamed
codingconduct
0
310
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
430
Abbi's Birthday
coloredviolet
3
9.6k
Building AI with AI
inesmontani
PRO
1
1.2k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
490
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)
͋Γ͕ͱ͏͍͟͝·ͨ͠