この記事は「Elixir Advent Calendar 2023」22日目の記事です
東京にいるけどfukuokaexのYOSUKEです。
普段は 合同会社TheWaggle で教材開発・システム開発・研修講師などマルチに活動してます。
このシリーズでは、文系ですらない、体育会系でも始められるプログラミング学習 というテーマで元自衛官だった僕が
自衛官からエンジニアになってもらいたいという気持ちを込めて、普段は大人しいですが、このコラムシリーズでは、あえて、体育会系のノリで、貴様ら理屈で覚えるなら体で覚えろ!というノリで書いてみたいと思います。
なので、初学者向けですが、理論は後回し、まずは動かして体感しろってノリの第22回目です。
それでは、いくぞ!
多目的ナイフと正規表現
よーし、貴様ら! 今日は前回に伝えたコードの中から、貴様らが最も気になっているであろう、~r/[gml]/
この部分について説明してやろう!
defmodule TNT do
def create_c4({"RDX", rdx}, {"ポリイソブチレン", polyisobutylene}, {"モーターオイル", motorOil}, {"セバシン酸ジオクチル", dioctylSebacate}, {"ガソリン", gasoline}) do
materials = [rdx, polyisobutylene, motorOil, dioctylSebacate, gasoline]
Enum.map(materials, &convert_material_to_numeric/1)
end
defp convert_material_to_numeric(material) do
numeric_part = String.replace(material, ~r/[gml]/, "")
convert_to_numeric(numeric_part)
end
defp convert_to_numeric(numeric_part) do
if String.contains?(numeric_part, ".") do
String.to_float(numeric_part)
else
String.to_integer(numeric_part)
end
end
end
このコードの ~r/[gml]/
は、正規表現
というものを使っている。これは「g」、「m」、または「l」のいずれかの文字を探す命令だ。まるで、偵察隊が特定の目標を探しているようなものだ。敵の隊列を探すのと同じく、この命令は特定のパターンを見つけ出す。
次に、String.replace(material, ~r/[gml]/, "") だ。これは、見つけた「g」、「m」、または「l」を除去する。敵の通信を妨害するように、ここでは無用な文字を排除している。
このように、正規表現は特定のパターンを見つけ、それに基づいてアクションを起こす。それは戦闘での戦術と同じだ。目標を特定し、命令に従って行動する。この技術をマスターすれば、コードの中でより効率的に操作ができるようになる。
正規表現
正規表現とは、いわば「多目的ナイフ」や「十徳ナイフ」のようなものだ。なぜなら、正規表現は一つのツールで多くの異なるタスクをこなすことができ、非常に汎用性が高いからだ。
考えてみろ、多目的ナイフは一つの道具で、刃物、はさみ、ノコギリ、栓抜きなど、様々な機能を持っている。これと同じように、正規表現も一つの「パターン」や「式」で、文字列の検索、置換、データの抽出といった多くの操作を行うことができる。
戦場での状況は常に変わる。敵の配置、地形、天候など、戦闘に影響を与える要素は数え切れない。これに対応するためには、柔軟で汎用的なツールが必要だ。正規表現も同様で、さまざまな文字列処理の問題に対して、一つの強力なツールとして機能する。
そんな多目的ナイフの使い方を今から教えてやるから覚えておけ!
正規表現(Regular Expression)とは、文字列の中から特定のパターンを見つけ出し、操作するための強力なツールだ。複雑で多様な状況に対応できる。正規表現は、文字列の検索、置換、データの抽出に使用される。
基本的な構成要素を見ていくぞ
-
リテラル文字: 通常の文字(例:a、B、1)は、それ自体が検索対象となる。
-
ドット
.
: 任意の一文字にマッチする。例えば、a.b
はacb
、aab
、axb
などにマッチする。 -
文字クラス
[]
: 括弧内の任意の一文字にマッチする。例:[abc]
はa
、b
、c
のいずれかにマッチする。 -
繰り返し
*
と+
:*
は直前の要素が0回以上の繰り返しにマッチし、+
は1回以上の繰り返しにマッチする。例:a*b
はb
、ab
、aab
などにマッチする。 -
エスケープ
\
: 特殊文字を普通の文字として扱うために使う。例:.
は任意の文字にマッチするが、\.
はピリオド自体にマッチする。 -
開始
^
と終了$
:^
は文字列の開始部分、$
は終了部分にマッチする。例:^abc
は「abc
」で始まる任意の文字列にマッチする。
これらは基本的な要素だ。しかし正規表現にはもっと多くの機能がある。より複雑なパターンを作成できるように、これらの要素を組み合わせて使う。
例えば、~r/[gml]/
は「g
」、「m
」、または「l
」のいずれか一文字にマッチする。これを使えば、文字列から特定の文字を見つけ出し、操作できる。
分かったか、貴様ら!これはただの基本だ。正規表現は、様々な状況に応じて変化する戦術のようなもの。これをマスターするには、実践が必要だ。訓練を重ね、この知識を武器に変えろ!
今日はここまで、それでは次回 Part23でまた会おう!