こんにちは!
プログラミング未経験文系出身、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文字とカウントします。
例
String.length("elixir")
6
余談
String.length
はString.graphemes(string) |> Enum.count()
と同じ処理と理解しています
String.length
を使用した場合
※"é"はU+0065 と U+0301 の結合文字列です。1
String.length("é")
1
String.length
を使用しない場合
String.graphemes("é") |> Enum.count()
1
String.match?とは
String.match?(string, regex)
はstring
に対してregex
にマッチするか否かをチェックします。
この関数と同様の機能を提供するものとして下記があります
・=~
(テキストベースのマッチ演算子)
・Regex.match?(regex, string)
例
String.match?("foo", ~r/foo/)
true
String.match?("bar", ~r/foo/)
false
String.myers_differenceとは
String.myers_difference(string1, string2)
はstring1
とstring2
の差分を比較します。
string1
をstring2
と一致させるために必要な編集の差分を出力します。
例
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、string1
をstring2
で同じ箇所。編集不要
・キーがins:
のときはinsert、string1
に対して値の文字列を挿入する編集が入る
・キーがdel:
のときはdelete、string1
に対して値の文字列を削除する編集が入る
String.next_codepointとは
String.next_codepoint(arg)
はarg
内の先頭のコードポイントと残りの文字列のタプルを返します。
例
String.next_codepoint("olá")
{"o", "lá"}
arg
がUTF-8でエンコードされた文字列ではないバイトシーケンスで始まる場合
出力は最初のバイトを含むバイナリ型で返される
※下記の\x80
はUTF-8でエンコードされた文字列ではない
invalid = "\x80\x80hogehoge"
{_, rest} = String.next_codepoint(invalid)
{<<128>>, <<128, 104, 111, 103, 101, 104, 111, 103, 101>>}
String.next_codepoint(rest)
{<<128>>, "hogehoge"}
String.next_graphemeとは
String.next_codepoint(string)
はstring
内の先頭の書記素と残りの文字列のタプルを返します。
例
※"é"はU+0065 と U+0301 の結合文字列です。1
String.next_grapheme("é")
{"é", ""} #書記素ベースの場合、結合文字列を1文字と認識している
※比較用
String.next_codepoint("é")
{"e", "́ "} #コードポイントベースの場合、結合文字列を2文字と認識している
~Elixirの国のご案内~
↓Elixirって何ぞや?と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます
↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ!私もエンジニア未経験から学習中です。
↓We Are The Alchemists, my friends!2
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。3
-
書記素とコードポイントの違い https://qiita.com/Alicesky2127/items/8dcb4612dd3f6ba6f59b ↩ ↩2
-
@torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。 ↩