はじめに
^
や*
といった謎の文字列を見かけることが多く、理解に苦しんでいた”正規表現”についてまとめました。
正規表現(Regex: Regular Expression)とは
文字列のパターンを表現するための記法のことで、
特定のパターンにマッチする文字列を検索・抽出・置換するためのルールのことを言います。
正規表現を使うことで、電話番号やメールアドレスのような特定の形式をもつ文字列の検索が簡単になります。
構成要素
正規表現を理解するためには、以下の要素を理解する必要があります。これらの要素を組み合わせて使用することで、検索したいパターンを作成することができます。
1. メタキャラクタ
特定の意味を持つ特殊な文字のことを指します。
代表的なメタ文字一覧
メタ文字 | 意味 |
---|---|
. |
任意の1文字にマッチ (改行文字を除く) |
* |
直前の文字が0回以上繰り返す |
+ |
直前の文字が1回以上繰り返す |
? |
直前の文字が0回または1回出現 |
^ |
行の先頭にマッチ |
$ |
行の末尾にマッチ |
\ |
エスケープ文字 (特殊文字をエスケープする) |
[] |
文字クラス (指定した文字のいずれかにマッチ) |
| | OR条件 (A|BでAまたはBにマッチ) |
() |
グループ化 (部分式をグループ化する) |
2. 文字セット
正規表現の中で「特定の文字のいずれか1つ」にマッチさせるための仕組みのことを指します。
文字セットを使うことで、複数の文字の中からどれか1つにマッチするパターンを簡単に表現できます。
基本的な使い方
①角括弧 []
角括弧の中に文字を記述し、指定した文字のいずれか1つにマッチします。
②範囲指定
文字セット内でハイフン-
を使用することで、連続した文字や数字の範囲を指定することができます。
(例)[a-zA-Z]
大文字または小文字のアルファベットのいずれか1文字にマッチ
③否定の文字セット
文字セットの先頭に^
を置くことで、「指定した文字以外」にマッチします。
(例)[^abc]
"a", "b", "c" 以外の任意の1文字にマッチ
3. 文字クラス
特定の文字セットにマッチさせるために使用します。
(例)[abc]
a、b、cのいずれか1文字にマッチ
4. 量指定子
直前の文字やグループが何回繰り返されるかを指定します。
{}
(中括弧)を使って表現します。
(例)
{0}
: 直前の文字がちょうど0回繰り返す
{0,}
{1,}
: 直前の文字が0回、1回以上繰り返す(*
+
)
{0,1}
: 直前の文字が0回以上、1回以下(0回または1回)繰り返す(?
)
※実際には*
+
?
のようなショートカットを使用されることが多いです。
※「0回以上繰り返す」という表現は、指定した文字が存在しなくてもいいことを意味します。
5. エスケープシーケンス
特殊文字をそのままの文字として扱いたい場合、バックスラッシュ\
を使ってエスケープします。
エスケープすることで文字として認識することができます。
※特殊文字:正規表現以外でも使用される、特別な意味を持つ文字のこと。
(例)
\.
ピリオドそのものにマッチ
\*
アスタリスクそのものにマッチ
\\
バックスラッシュそのものにマッチ
具体例
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
^
行の先頭
[a-zA-Z0-9._%+-]+
ユーザー名部分(英数字と一部の記号)
@
@マーク
[a-zA-Z0-9.-]+
ドメイン名部分
\.
ドット
[a-zA-Z]{2,}$
トップレベルドメイン(2文字以上)
まとめ
正規表現は、要素を組み合わせることで文字列操作を簡単にします。
仮に、正規表現を使わない場合、if 文や for ループが増えてコードが複雑になる傾向があります。
たとえば、文字列の中に 「abc」 が含まれるかどうかをチェックするとき、 contains() メソッドを使ったり、文字列 = ""
などを使ってチェックしますが、この方法だと「ac」「aBc」など「abc」以外の条件が増えると、if 文や for ループが増えてコードが複雑になってしまいます。
このような記述を減らす方法として正規表現は強力なツールになります。
最後までご覧いただき、ありがとうございました。
参考にしたURL
・https://zenn.dev/ryome/articles/9a28660d27363b(『正規表現の基礎まとめ』)
・https://www.tohoho-web.com/perl/regexp.htm(『正規表現』とほほのWWW入門)