SlideShare a Scribd company logo
1 of 21
Download to read offline
Ruby の文字列について
2019/08/14
大手町.rb #20
大手町.rb #20 発表資料 「Rubyの文字列について」
1自己紹介
Tomoya Kawanishi a.k.a. @cuzic
ENECHANGE 株式会社 チーフエンジニア
電力会社、ガス会社を切り替えるなら、エネチェンジ経由で!
一般家庭も!法人も!
Ruby関西の中の人
発表者として登壇くださる方、あとで声かけください。
大阪RubyKaigi02 を 9月15日(日)に開催予定
大手町.rb の中の人
毎月 大手町.rb を第2火曜日に開催
東京駅、各線大手町駅から直結!
Ruby の初級者がメインターゲット
大手町.rb #20 発表資料 「Rubyの文字列について」
今日のテーマ
文字列
便利メソッドの紹介
要は、Ruby リファレンスマニュアルの抜粋です。
https://ruby-doc.org/core-2.6/String.html
https://docs.ruby-lang.org/ja/latest/class/String.html
マルチバイト文字の扱いについて
手元のパソコンで試しながら聞いてください。
2
大手町.rb #20 発表資料 「Rubyの文字列について」
String#% 、 String#*
String#% : sprintf のようなフォーマット出力
String#* : 文字列の繰り返し
3
# String#%
irb> "%05d" % 123
"00123"
irb> "=" * 20
=> "===================="
大手町.rb #20 発表資料 「Rubyの文字列について」
String#+@ 、 String#-@
String#+@ : mutable な文字列を返す
String#-@ : immutable (frozen)な文字列を返す
4
irb> a = "abc"
irb> a.object_id
47022212942940
irb> b = +a
"abc"
irb> b.object_id
47022212942940
irb> c = -a
"abc"
irb> c.object_id
47022212874160
irb> "hoge" << "huga"
"hogehuga"
irb> (-"hoge") << "huga"
RuntimeError: can't modify frozen String
大手町.rb #20 発表資料 「Rubyの文字列について」
String#[] 1/2
String#[index] : index位置の文字
String#[start, length] : start から length 文字分
5
a = "hello there"
a[1] #=> "e"
a[2, 3] #=> "llo"
a[2..3] #=> "ll"
a[-3, 2] #=> "er"
a[7..-2] #=> "her"
a[-4..-2] #=> "her"
a[-2..-4] #=> ""
"a¥u0300" #=> "à" # grapheme cluster は1つ
"a¥u0300"[0] #=> "a" # grapheme cluster の一部が取り出される
大手町.rb #20 発表資料 「Rubyの文字列について」
String#[] 2/2
String#[regexp] :正規表現マッチの全体
String#[regexp, n] :n番目のマッチ
String#[regexp, capture] : capture 文字列に対応す
るマッチ
String#[substr] : サブ文字列があれば、それを返す
6
a = "hello there"
a[/[aeiou](.)¥1/] #=> "ell" 正規表現マッチの全体
a[/[aeiou](.)¥1/, 0] #=> "ell" 正規表現マッチの全体
a[/[aeiou](.)¥1/, 1] #=> "l" 最初の括弧に対応する正規表現マッチ
a[/[aeiou](.)¥1/, 2] #=> nil 2番目のマッチ。(この場合ないから nil)
a[/(?<vowel>[aeiou])(?<non_vowel>[^aeiou])/, "non_vowel"] #=> "l"
a[/(?<vowel>[aeiou])(?<non_vowel>[^aeiou])/, "vowel"] #=> "e"
a["lo"] #=> "lo"
a["bye"] #=> nil
大手町.rb #20 発表資料 「Rubyの文字列について」
String#concat
String#concat:文字列の連結
複数の引数を指定して、一度に連結できる
7
a = "hello "
a.concat("world", 33) #=> "hello world!"
a #=> "hello world!"
b = "sn"
b.concat("_", b, "_", b) #=> "sn_sn_sn"
大手町.rb #20 発表資料 「Rubyの文字列について」
String#delete
String#delete:文字の削除
String#delete_prefix : 先頭の削除
String#delete_suffix : 末尾の削除
8
"hello".delete "l","lo" #=> "heo" "l" と "lo" の積集合の "l" を削除
"hello".delete "lo" #=> "he" 文字 "l" と "o" をすべて削除
"hello".delete "aeiou", "^e" #=> "hell" 第1引数から "e" を除いた文字を削除
"hello".delete "ej-m" #=> "ho" "e" と "j" から "m" の文字を削除
"hello".delete_prefix("hel") #=> "lo" 文字列先頭の "hel" を削除
"hello".delete_prefix("llo") #=> "hello"
"hello".delete_suffix("llo") #=> "he" 文字列末尾の "llo" を削除
"hello".delete_suffix("hel") #=> "hello"
大手町.rb #20 発表資料 「Rubyの文字列について」
String#end_with?
String#end_with? : 末尾が引数と一致しているか?
複数指定した場合は、どれか1つでも一致しているか?
9
"hello".end_with?("ello") #=> true
# returns true if one of the +suffixes+ matches.
"hello".end_with?("heaven", "ello") #=> true
"hello".end_with?("heaven", "paradise") #=> false
大手町.rb #20 発表資料 「Rubyの文字列について」
String#gsub
文字列の置換
ブロック引数で、任意の置換ロジックを指定できる
ハッシュを渡すと、マッチした部分をキーとして、
ハッシュを引いた値で置き換えられる
10
"hello".gsub(/[aeiou]/, '*') #=> "h*ll*"
"hello".gsub(/([aeiou])/, '<¥1>') #=> "h<e>ll<o>"
"hello".gsub(/./) {|s| s.ord.to_s + ' '} #=> "104 101 108 108
111 "
"hello".gsub(/(?<foo>[aeiou])/, '{¥k<foo>}') #=> "h{e}ll{o}"
'hello'.gsub(/[eo]/, 'e' => 3, 'o' => '*') #=> "h3ll*"
大手町.rb #20 発表資料 「Rubyの文字列について」
String#match
正規表現のマッチ結果を返す
11
'hello'.match('(.)¥1') #=> #<MatchData "ll" 1:"l">
'hello'.match('(.)¥1')[0] #=> "ll" 引数が文字列でも正規表現と同様の動作
'hello'.match(/(.)¥1/)[0] #=> "ll"
'hello'.match(/(.)¥1/, 3) #=> nil
'hello'.match('xx') #=> nil マッチしないときは nil を返す
'hello'.match('(.)¥1') do |str|
p str
end
大手町.rb #20 発表資料 「Rubyの文字列について」
String#match?
String#match? : 文字列のマッチ。true, false を返す
$& などを更新しない分高速。
12
"Ruby".match?(/R.../) #=> true
"Ruby".match?(/R.../, 1) #=> false
"Ruby Raspberry".match?(/R.../, 1) #=> true
"Ruby".match?(/P.../) #=> false
$& #=> nil match? は $& を更新しない
大手町.rb #20 発表資料 「Rubyの文字列について」
String#partition 、 String#rpartition
String#partition :引数 sep で分割して、
sep 以前の文字列、sep 、sep 以降の文字列の3要素の
文字列の配列を返す。見つからない場合、[self, "", ""]
という3要素の配列を返す。
sep は文字列でも正規表現でもいい
末尾から探索する場合、rpartition を使う
13
"hello".partition("l") #=> ["he", "l", "lo"]
"hello".partition("x") #=> ["hello", "", ""]
"hello".partition(/.l/) #=> ["h", "el", "lo"]
"hello".rpartition("l") #=> ["hel", "l", "o"]
"hello".rpartition("x") #=> ["", "", "hello"]
"hello".rpartition(/.l/) #=> ["he", "ll", "o"]
大手町.rb #20 発表資料 「Rubyの文字列について」
String#prepend
String#prepend : 先頭に文字列を追加
concat の逆向き。破壊的メソッド
14
a = "!"
a.prepend("hello ", "world") #=> "hello world!"
a #=> "hello world!"
大手町.rb #20 発表資料 「Rubyの文字列について」
String#scan
String#scan :引数にマッチする部分を文字列から取り出す。
正規表現のパターンに () があれば、配列の配列を返す
ブロックを与えると、引数のパターンと一致する部分を繰り返しブロックを実
行する
15
a = "cruel world"
a.scan(/¥w+/) #=> ["cruel", "world"]
a.scan(/.../) #=> ["cru", "el ", "wor"]
a.scan(/(...)/) #=> [["cru"], ["el "], ["wor"]]
a.scan(/(..)(..)/) #=> [["cr", "ue"], ["l ", "wo"]]
s = "of the people, by the people, for the people"
hash = Hash.new(0)
s.scan(/¥w+/) {|word| hash[word] += 1 }
p hash #=> {"of"=>1, "the"=>3, "people"=>3, "by"=>1, "for"=>1}
大手町.rb #20 発表資料 「Rubyの文字列について」
日本語文字コードの歴史
狭義の Shift_JIS: JIS X 0208符号化文字集合・・・
CP932:マイクロソフトが制定。各ベンダが拡張可能
混乱の時代
NEC 特殊文字、NEC選定IBM拡張文字、IBM拡張文字
マイクロソフトが統一。独自拡張の禁止
Ruby では
Shift_JIS は狭義のシフトJIS
SJIS、CP932、Windows-31J は MS 統一後のシフトJIS
16
大手町.rb #20 発表資料 「Rubyの文字列について」
Ruby の文字列の扱い
Ruby 1.8 時代
ただのバイト列だった
エンコーディング情報を持たずどう扱うかはプログラム次第
正規表現にはエンコーディングがあった
Ruby 1.9 以降
文字列のエンコーディングは文字列自体が知っている
バイト列として扱いたいときは、ASCII-8Bit などを指定する
bytes とか each_byte のようなメソッドもある
codepoints とか each_codepoint とかのようなコードポイン
トを順に返すメソッドもある
文字を順に扱いたいときは chars とか each_char を使う
書記素クラスタ用の each_grapheme_cluster もある
例) "a¥u0300" #=> "à"
17
大手町.rb #20 発表資料 「Rubyの文字列について」
String#encode
encodeには replace や undef 等のオプションを指定可能
invalid: 変換前の文字コードが不正なときの処理方法を指定
undef: 変換後、対応文字がないときの処理方法を指定
replace: invalid や undef を指定したときの代替文字を指定
crlf_newline: 改行文字"¥n" を "¥r¥n" に置き換える
18
# U+00B7 MIDDLE DOT, U+2014 EM DASH は対応する文字が Windows-31J には
# 存在しないのでそのまま変換しようとすると
Encoding::UndefinedConversionError が発生する
pry> str = "¥u00b7¥u2014"
=> "·—"
pry> str.encode("Windows-31J", fallback: { "¥u00b7" =>
"¥xA5".force_encoding("Windows-31J"), "¥u2014" =>
"¥x81¥x5C".force_encoding("Windows-31J") })
=> "¥xA5¥x{815C}"
pry> str.encode("Windows-31J", undef: :replace)
=> "??"
大手町.rb #20 発表資料 「Rubyの文字列について」
まとめ
今日は String クラスの主なメソッドについて紹介しま
した。
すべて知っていた方はかなりの上級者だと思います。
String クラスもバージョンアップにともない、
機能追加、メソッド追加がいろいろあったりします。
私自身も改めて調べてみて、とても勉強になりました
19
ご清聴ありがとう
ございました

More Related Content

Similar to Ruby の文字列について

Ruby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてRuby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてTomoya Kawanishi
 
Rails基礎講座 part.1
Rails基礎講座 part.1Rails基礎講座 part.1
Rails基礎講座 part.1Jun Yokoyama
 
RubyのDir、File、IO について
RubyのDir、File、IO についてRubyのDir、File、IO について
RubyのDir、File、IO についてTomoya Kawanishi
 
C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1
C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1
C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1耕平 谷口
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRubyemasaka
 
Ruby講座第二回
Ruby講座第二回Ruby講座第二回
Ruby講座第二回mitsunaga
 
初級者向けレッスン 52回 ─── 文字列
初級者向けレッスン 52回 ─── 文字列初級者向けレッスン 52回 ─── 文字列
初級者向けレッスン 52回 ─── 文字列higaki
 

Similar to Ruby の文字列について (8)

Ruby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてRuby の制御構造とリテラルについて
Ruby の制御構造とリテラルについて
 
Rails基礎講座 part.1
Rails基礎講座 part.1Rails基礎講座 part.1
Rails基礎講座 part.1
 
RubyのDir、File、IO について
RubyのDir、File、IO についてRubyのDir、File、IO について
RubyのDir、File、IO について
 
C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1
C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1
C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRuby
 
Ruby講座第二回
Ruby講座第二回Ruby講座第二回
Ruby講座第二回
 
Rake
RakeRake
Rake
 
初級者向けレッスン 52回 ─── 文字列
初級者向けレッスン 52回 ─── 文字列初級者向けレッスン 52回 ─── 文字列
初級者向けレッスン 52回 ─── 文字列
 

More from Tomoya Kawanishi

ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例Tomoya Kawanishi
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウTomoya Kawanishi
 
Ruby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてTomoya Kawanishi
 
Ruby初心者からよく質問されること
Ruby初心者からよく質問されることRuby初心者からよく質問されること
Ruby初心者からよく質問されることTomoya Kawanishi
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことTomoya Kawanishi
 
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選Tomoya Kawanishi
 
HTTPと Webクローリングについて
HTTPと WebクローリングについてHTTPと Webクローリングについて
HTTPと WebクローリングについてTomoya Kawanishi
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interfaceTomoya Kawanishi
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能についてTomoya Kawanishi
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーTomoya Kawanishi
 
Thread の利用事例紹介
Thread の利用事例紹介Thread の利用事例紹介
Thread の利用事例紹介Tomoya Kawanishi
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler についてTomoya Kawanishi
 
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法Tomoya Kawanishi
 
マークアップで使えるRuby
マークアップで使えるRubyマークアップで使えるRuby
マークアップで使えるRubyTomoya Kawanishi
 
エネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例についてエネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例についてTomoya Kawanishi
 
AWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分についてAWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分についてTomoya Kawanishi
 
Pry による repl 駆動開発について
Pry による repl 駆動開発についてPry による repl 駆動開発について
Pry による repl 駆動開発についてTomoya Kawanishi
 
Module での名前解決について
Module での名前解決についてModule での名前解決について
Module での名前解決についてTomoya Kawanishi
 

More from Tomoya Kawanishi (20)

英単語の覚え方
英単語の覚え方英単語の覚え方
英単語の覚え方
 
ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウ
 
Ruby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構について
 
Ruby初心者からよく質問されること
Ruby初心者からよく質問されることRuby初心者からよく質問されること
Ruby初心者からよく質問されること
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったこと
 
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選
 
HTTPと Webクローリングについて
HTTPと WebクローリングについてHTTPと Webクローリングについて
HTTPと Webクローリングについて
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interface
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能について
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
 
Thread の利用事例紹介
Thread の利用事例紹介Thread の利用事例紹介
Thread の利用事例紹介
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
 
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
 
マークアップで使えるRuby
マークアップで使えるRubyマークアップで使えるRuby
マークアップで使えるRuby
 
エネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例についてエネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例について
 
AWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分についてAWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分について
 
Pry による repl 駆動開発について
Pry による repl 駆動開発についてPry による repl 駆動開発について
Pry による repl 駆動開発について
 
Module での名前解決について
Module での名前解決についてModule での名前解決について
Module での名前解決について
 
Tsort について
Tsort についてTsort について
Tsort について
 

Recently uploaded

「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-LoopへTetsuya Nihonmatsu
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfMatsushita Laboratory
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)ssuser539845
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法ssuser370dd7
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見Shumpei Kishi
 
【修士論文】代替出勤者の選定業務における依頼順決定方法に関する研究   千坂知也
【修士論文】代替出勤者の選定業務における依頼順決定方法に関する研究   千坂知也【修士論文】代替出勤者の選定業務における依頼順決定方法に関する研究   千坂知也
【修士論文】代替出勤者の選定業務における依頼順決定方法に関する研究   千坂知也harmonylab
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦Sadao Tokuyama
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor arts yokohama
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~arts yokohama
 
Summary of "ChatDoctor: A Medical Chat Model Fine-Tuned on a Large Language M...
Summary of "ChatDoctor: A Medical Chat Model Fine-Tuned on a Large Language M...Summary of "ChatDoctor: A Medical Chat Model Fine-Tuned on a Large Language M...
Summary of "ChatDoctor: A Medical Chat Model Fine-Tuned on a Large Language M...yoshidakids7
 

Recently uploaded (13)

「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
 
2024 03 CTEA
2024 03 CTEA2024 03 CTEA
2024 03 CTEA
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
 
2024 04 minnanoito
2024 04 minnanoito2024 04 minnanoito
2024 04 minnanoito
 
【修士論文】代替出勤者の選定業務における依頼順決定方法に関する研究   千坂知也
【修士論文】代替出勤者の選定業務における依頼順決定方法に関する研究   千坂知也【修士論文】代替出勤者の選定業務における依頼順決定方法に関する研究   千坂知也
【修士論文】代替出勤者の選定業務における依頼順決定方法に関する研究   千坂知也
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
 
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
 
Summary of "ChatDoctor: A Medical Chat Model Fine-Tuned on a Large Language M...
Summary of "ChatDoctor: A Medical Chat Model Fine-Tuned on a Large Language M...Summary of "ChatDoctor: A Medical Chat Model Fine-Tuned on a Large Language M...
Summary of "ChatDoctor: A Medical Chat Model Fine-Tuned on a Large Language M...
 

Ruby の文字列について

  • 2. 大手町.rb #20 発表資料 「Rubyの文字列について」 1自己紹介 Tomoya Kawanishi a.k.a. @cuzic ENECHANGE 株式会社 チーフエンジニア 電力会社、ガス会社を切り替えるなら、エネチェンジ経由で! 一般家庭も!法人も! Ruby関西の中の人 発表者として登壇くださる方、あとで声かけください。 大阪RubyKaigi02 を 9月15日(日)に開催予定 大手町.rb の中の人 毎月 大手町.rb を第2火曜日に開催 東京駅、各線大手町駅から直結! Ruby の初級者がメインターゲット
  • 3. 大手町.rb #20 発表資料 「Rubyの文字列について」 今日のテーマ 文字列 便利メソッドの紹介 要は、Ruby リファレンスマニュアルの抜粋です。 https://ruby-doc.org/core-2.6/String.html https://docs.ruby-lang.org/ja/latest/class/String.html マルチバイト文字の扱いについて 手元のパソコンで試しながら聞いてください。 2
  • 4. 大手町.rb #20 発表資料 「Rubyの文字列について」 String#% 、 String#* String#% : sprintf のようなフォーマット出力 String#* : 文字列の繰り返し 3 # String#% irb> "%05d" % 123 "00123" irb> "=" * 20 => "===================="
  • 5. 大手町.rb #20 発表資料 「Rubyの文字列について」 String#+@ 、 String#-@ String#+@ : mutable な文字列を返す String#-@ : immutable (frozen)な文字列を返す 4 irb> a = "abc" irb> a.object_id 47022212942940 irb> b = +a "abc" irb> b.object_id 47022212942940 irb> c = -a "abc" irb> c.object_id 47022212874160 irb> "hoge" << "huga" "hogehuga" irb> (-"hoge") << "huga" RuntimeError: can't modify frozen String
  • 6. 大手町.rb #20 発表資料 「Rubyの文字列について」 String#[] 1/2 String#[index] : index位置の文字 String#[start, length] : start から length 文字分 5 a = "hello there" a[1] #=> "e" a[2, 3] #=> "llo" a[2..3] #=> "ll" a[-3, 2] #=> "er" a[7..-2] #=> "her" a[-4..-2] #=> "her" a[-2..-4] #=> "" "a¥u0300" #=> "à" # grapheme cluster は1つ "a¥u0300"[0] #=> "a" # grapheme cluster の一部が取り出される
  • 7. 大手町.rb #20 発表資料 「Rubyの文字列について」 String#[] 2/2 String#[regexp] :正規表現マッチの全体 String#[regexp, n] :n番目のマッチ String#[regexp, capture] : capture 文字列に対応す るマッチ String#[substr] : サブ文字列があれば、それを返す 6 a = "hello there" a[/[aeiou](.)¥1/] #=> "ell" 正規表現マッチの全体 a[/[aeiou](.)¥1/, 0] #=> "ell" 正規表現マッチの全体 a[/[aeiou](.)¥1/, 1] #=> "l" 最初の括弧に対応する正規表現マッチ a[/[aeiou](.)¥1/, 2] #=> nil 2番目のマッチ。(この場合ないから nil) a[/(?<vowel>[aeiou])(?<non_vowel>[^aeiou])/, "non_vowel"] #=> "l" a[/(?<vowel>[aeiou])(?<non_vowel>[^aeiou])/, "vowel"] #=> "e" a["lo"] #=> "lo" a["bye"] #=> nil
  • 8. 大手町.rb #20 発表資料 「Rubyの文字列について」 String#concat String#concat:文字列の連結 複数の引数を指定して、一度に連結できる 7 a = "hello " a.concat("world", 33) #=> "hello world!" a #=> "hello world!" b = "sn" b.concat("_", b, "_", b) #=> "sn_sn_sn"
  • 9. 大手町.rb #20 発表資料 「Rubyの文字列について」 String#delete String#delete:文字の削除 String#delete_prefix : 先頭の削除 String#delete_suffix : 末尾の削除 8 "hello".delete "l","lo" #=> "heo" "l" と "lo" の積集合の "l" を削除 "hello".delete "lo" #=> "he" 文字 "l" と "o" をすべて削除 "hello".delete "aeiou", "^e" #=> "hell" 第1引数から "e" を除いた文字を削除 "hello".delete "ej-m" #=> "ho" "e" と "j" から "m" の文字を削除 "hello".delete_prefix("hel") #=> "lo" 文字列先頭の "hel" を削除 "hello".delete_prefix("llo") #=> "hello" "hello".delete_suffix("llo") #=> "he" 文字列末尾の "llo" を削除 "hello".delete_suffix("hel") #=> "hello"
  • 10. 大手町.rb #20 発表資料 「Rubyの文字列について」 String#end_with? String#end_with? : 末尾が引数と一致しているか? 複数指定した場合は、どれか1つでも一致しているか? 9 "hello".end_with?("ello") #=> true # returns true if one of the +suffixes+ matches. "hello".end_with?("heaven", "ello") #=> true "hello".end_with?("heaven", "paradise") #=> false
  • 11. 大手町.rb #20 発表資料 「Rubyの文字列について」 String#gsub 文字列の置換 ブロック引数で、任意の置換ロジックを指定できる ハッシュを渡すと、マッチした部分をキーとして、 ハッシュを引いた値で置き換えられる 10 "hello".gsub(/[aeiou]/, '*') #=> "h*ll*" "hello".gsub(/([aeiou])/, '<¥1>') #=> "h<e>ll<o>" "hello".gsub(/./) {|s| s.ord.to_s + ' '} #=> "104 101 108 108 111 " "hello".gsub(/(?<foo>[aeiou])/, '{¥k<foo>}') #=> "h{e}ll{o}" 'hello'.gsub(/[eo]/, 'e' => 3, 'o' => '*') #=> "h3ll*"
  • 12. 大手町.rb #20 発表資料 「Rubyの文字列について」 String#match 正規表現のマッチ結果を返す 11 'hello'.match('(.)¥1') #=> #<MatchData "ll" 1:"l"> 'hello'.match('(.)¥1')[0] #=> "ll" 引数が文字列でも正規表現と同様の動作 'hello'.match(/(.)¥1/)[0] #=> "ll" 'hello'.match(/(.)¥1/, 3) #=> nil 'hello'.match('xx') #=> nil マッチしないときは nil を返す 'hello'.match('(.)¥1') do |str| p str end
  • 13. 大手町.rb #20 発表資料 「Rubyの文字列について」 String#match? String#match? : 文字列のマッチ。true, false を返す $& などを更新しない分高速。 12 "Ruby".match?(/R.../) #=> true "Ruby".match?(/R.../, 1) #=> false "Ruby Raspberry".match?(/R.../, 1) #=> true "Ruby".match?(/P.../) #=> false $& #=> nil match? は $& を更新しない
  • 14. 大手町.rb #20 発表資料 「Rubyの文字列について」 String#partition 、 String#rpartition String#partition :引数 sep で分割して、 sep 以前の文字列、sep 、sep 以降の文字列の3要素の 文字列の配列を返す。見つからない場合、[self, "", ""] という3要素の配列を返す。 sep は文字列でも正規表現でもいい 末尾から探索する場合、rpartition を使う 13 "hello".partition("l") #=> ["he", "l", "lo"] "hello".partition("x") #=> ["hello", "", ""] "hello".partition(/.l/) #=> ["h", "el", "lo"] "hello".rpartition("l") #=> ["hel", "l", "o"] "hello".rpartition("x") #=> ["", "", "hello"] "hello".rpartition(/.l/) #=> ["he", "ll", "o"]
  • 15. 大手町.rb #20 発表資料 「Rubyの文字列について」 String#prepend String#prepend : 先頭に文字列を追加 concat の逆向き。破壊的メソッド 14 a = "!" a.prepend("hello ", "world") #=> "hello world!" a #=> "hello world!"
  • 16. 大手町.rb #20 発表資料 「Rubyの文字列について」 String#scan String#scan :引数にマッチする部分を文字列から取り出す。 正規表現のパターンに () があれば、配列の配列を返す ブロックを与えると、引数のパターンと一致する部分を繰り返しブロックを実 行する 15 a = "cruel world" a.scan(/¥w+/) #=> ["cruel", "world"] a.scan(/.../) #=> ["cru", "el ", "wor"] a.scan(/(...)/) #=> [["cru"], ["el "], ["wor"]] a.scan(/(..)(..)/) #=> [["cr", "ue"], ["l ", "wo"]] s = "of the people, by the people, for the people" hash = Hash.new(0) s.scan(/¥w+/) {|word| hash[word] += 1 } p hash #=> {"of"=>1, "the"=>3, "people"=>3, "by"=>1, "for"=>1}
  • 17. 大手町.rb #20 発表資料 「Rubyの文字列について」 日本語文字コードの歴史 狭義の Shift_JIS: JIS X 0208符号化文字集合・・・ CP932:マイクロソフトが制定。各ベンダが拡張可能 混乱の時代 NEC 特殊文字、NEC選定IBM拡張文字、IBM拡張文字 マイクロソフトが統一。独自拡張の禁止 Ruby では Shift_JIS は狭義のシフトJIS SJIS、CP932、Windows-31J は MS 統一後のシフトJIS 16
  • 18. 大手町.rb #20 発表資料 「Rubyの文字列について」 Ruby の文字列の扱い Ruby 1.8 時代 ただのバイト列だった エンコーディング情報を持たずどう扱うかはプログラム次第 正規表現にはエンコーディングがあった Ruby 1.9 以降 文字列のエンコーディングは文字列自体が知っている バイト列として扱いたいときは、ASCII-8Bit などを指定する bytes とか each_byte のようなメソッドもある codepoints とか each_codepoint とかのようなコードポイン トを順に返すメソッドもある 文字を順に扱いたいときは chars とか each_char を使う 書記素クラスタ用の each_grapheme_cluster もある 例) "a¥u0300" #=> "à" 17
  • 19. 大手町.rb #20 発表資料 「Rubyの文字列について」 String#encode encodeには replace や undef 等のオプションを指定可能 invalid: 変換前の文字コードが不正なときの処理方法を指定 undef: 変換後、対応文字がないときの処理方法を指定 replace: invalid や undef を指定したときの代替文字を指定 crlf_newline: 改行文字"¥n" を "¥r¥n" に置き換える 18 # U+00B7 MIDDLE DOT, U+2014 EM DASH は対応する文字が Windows-31J には # 存在しないのでそのまま変換しようとすると Encoding::UndefinedConversionError が発生する pry> str = "¥u00b7¥u2014" => "·—" pry> str.encode("Windows-31J", fallback: { "¥u00b7" => "¥xA5".force_encoding("Windows-31J"), "¥u2014" => "¥x81¥x5C".force_encoding("Windows-31J") }) => "¥xA5¥x{815C}" pry> str.encode("Windows-31J", undef: :replace) => "??"
  • 20. 大手町.rb #20 発表資料 「Rubyの文字列について」 まとめ 今日は String クラスの主なメソッドについて紹介しま した。 すべて知っていた方はかなりの上級者だと思います。 String クラスもバージョンアップにともない、 機能追加、メソッド追加がいろいろあったりします。 私自身も改めて調べてみて、とても勉強になりました 19