10
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Stringモジュールで遊んでみたシリーズ④ -String.length ~ String.next_grapheme の紹介

Last updated at Posted at 2024-12-04

こんにちは!
プログラミング未経験文系出身、Elixirの国に迷い込んだ?!見習いアルケミストのaliceと申します。
今回はStringモジュールについて学んだことをまとめます。

目次

1.Stringモジュールで遊んでみたシリーズ① -String.at ~ String.chunk の紹介
2.Stringモジュールで遊んでみたシリーズ② -String.codepoints ~ String.ends_with? の紹介
3.Stringモジュールで遊んでみたシリーズ③ -String.equivalent? ~ String.last の紹介
4.Stringモジュールで遊んでみたシリーズ④ -String.length ~ String.next_grapheme の紹介(本記事)
5.Stringモジュールで遊んでみたシリーズ⑤ -String.next_grapheme_size ~ String.printable? の紹介
6.Stringモジュールで遊んでみたシリーズ⑥ -String.replace ~ String.replace_suffix の紹介
7.Stringモジュールで遊んでみたシリーズ⑦ -String.replace_trailing ~ String.split の紹介
8.Stringモジュールで遊んでみたシリーズ⑧ -String.split_at ~ String.to_charlist の紹介
9.Stringモジュールで遊んでみたシリーズ⑨ -String.to_existing_atom ~ String.trim の紹介
10.Stringモジュールで遊んでみたシリーズ10 -String.trim_leading ~ String.valid? の紹介

目的

Stringモジュールに含まれる関数を触って機能を理解したい

実行環境

Windows 11 + WSL2 + Ubuntu 22.04
Elixir v1.17.3
Erlang v27.0

String.lengthとは

String.length(string)stringの文字数を返します。
文字数は書記素ベースで1文字とカウントします。

iex
String.length("elixir")
6

余談

String.lengthString.graphemes(string) |> Enum.count()と同じ処理と理解しています

String.lengthを使用した場合

※"é"はU+0065 と U+0301 の結合文字列です。1

iex
String.length("é")
1

String.lengthを使用しない場合

iex
String.graphemes("é") |> Enum.count()
1

String.match?とは

String.match?(string, regex)stringに対してregexにマッチするか否かをチェックします。
この関数と同様の機能を提供するものとして下記があります
 ・=~ (テキストベースのマッチ演算子)
 ・Regex.match?(regex, string)

iex
String.match?("foo", ~r/foo/)
true
iex
String.match?("bar", ~r/foo/)
false

String.myers_differenceとは

String.myers_difference(string1, string2)string1string2の差分を比較します。
string1string2と一致させるために必要な編集の差分を出力します。

iex
string1 = "Tanaka Takumi"
string2 = "Tanaoka Takeshi"
String.myers_difference(string1, string2)
[eq: "Tana", ins: "o", eq: "ka Tak", del: "um", ins: "esh", eq: "i"]

・キーがeq:のときはequal、string1string2で同じ箇所。編集不要
・キーがins:のときはinsert、string1に対して値の文字列を挿入する編集が入る
・キーがdel:のときはdelete、string1に対して値の文字列を削除する編集が入る

String.next_codepointとは

String.next_codepoint(arg)arg内の先頭のコードポイントと残りの文字列のタプルを返します。

iex
String.next_codepoint("olá")
{"o", "lá"}

argがUTF-8でエンコードされた文字列ではないバイトシーケンスで始まる場合

出力は最初のバイトを含むバイナリ型で返される

※下記の\x80はUTF-8でエンコードされた文字列ではない

iex
invalid = "\x80\x80hogehoge"
{_, rest} = String.next_codepoint(invalid)
{<<128>>, <<128, 104, 111, 103, 101, 104, 111, 103, 101>>}
iex
String.next_codepoint(rest)
{<<128>>, "hogehoge"}

String.next_graphemeとは

String.next_codepoint(string)string内の先頭の書記素と残りの文字列のタプルを返します。

※"é"はU+0065 と U+0301 の結合文字列です。1

iex
String.next_grapheme("é")
{"é", ""} #書記素ベースの場合、結合文字列を1文字と認識している

※比較用

iex
String.next_codepoint("é")
{"e", "́ "} #コードポイントベースの場合、結合文字列を2文字と認識している

~Elixirの国のご案内~

↓Elixirって何ぞや?と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ!私もエンジニア未経験から学習中です。

We Are The Alchemists, my friends!:bouquet:2
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。3

  1. 書記素とコードポイントの違い https://qiita.com/Alicesky2127/items/8dcb4612dd3f6ba6f59b 2

  2. @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。

  3. @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中!

10
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?