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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
390
シェルスクリプトをサーバーレスで cron したい
yasuhiroki
1
930
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
Breaking the Seal: Static Deobfuscation of Compiled V8 JavaScript Bytecode Malware
hshrzd
0
610
取引先から届く 「セキュリティチェックシート」の読み解き方
kamadamakoto
0
120
SmartHR Engineering Team Deck
smarthr
0
200
【CEDEC2026】専門性の高いデフォルメチームが挑んだ人材育成戦略 〜Cygames Academiaの企画から実施まで〜
cygames
PRO
0
510
FPGAが実現する遠方宇宙の高空間分解能天体撮影 -大型地上望遠鏡の視力を補正する「補償光学」とは?-
komei_mt
0
100
[ChatGPT Work LT]事務作業が苦手な人のための バックオフィスの「半」自動化
chimaki_iot
0
240
今こそ聞きたいソフトウェア設計 ドメイン駆動設計再入門
masuda220
PRO
17
6.3k
【CEDEC2026】『GRANBLUE FANTASY: Relink - Endless Ragnarok』のバトル制作事例 ~最高のキャラゲーを目指して~
cygames
PRO
0
210
20260608_Codexの可能性_ノンプログラマー向け_大城追記
doradora09
PRO
0
770
Master Dataグループ紹介資料
sansan33
PRO
1
4.8k
生成 AI の基礎 〜 サンプル実装で学ぶ基本原理
enakai00
7
4.4k
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
53k
Featured
See All Featured
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
330
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
430
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
66
57k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
390
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Optimising Largest Contentful Paint
csswizardry
37
3.9k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
240
Evolving SEO for Evolving Search Engines
ryanjones
0
250
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
420
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
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)
͋Γ͕ͱ͏͍͟͝·ͨ͠