🔤

【正規表現】入門

2023/07/20に公開

はじめに

バリデーション(入力データチェック)やデータの検索・置換・抽出などに用いられる
「正規表現」について学習しましょう。

正規表現とは

正規表現は、文字列内の特定のパターンを検索したり置換したりするための表記方法です。
例えば、電話番号やメールアドレスなど、特定のフォーマットに一致する文字列を検索する際に利用します。

正規表現をテストするツール

正規表現の視覚化や、テストは以下のオンラインサービスが便利です。

Regex101の使い方は以下のページが参考になります。

https://softantenna.com/blog/regex101/

Regex101の画面右下に「Quick Reference」があるので、本ページの学習にはない記述方法もわかります。

正規表現

基本パターン

正規表現の基本パターンです。

パターン 説明 パターン例 パターン例に
マッチする文字列の例
. 任意の1文字にマッチ a.b
p1-1
aab
a@b
a1b
^ 行の先頭にマッチ ^abc
p1-2
abcdef
abc xyz
$ 行の末尾にマッチ xyz$
p1-3
abc xyz
123 xyz
* 直前の文字が
0回以上繰り返す
ab*c
p1-4
ac
abc
abbbc
+ 直前の文字が
1回以上繰り返す
ab+c
p1-5
abc
abbbc
{n} 直前の文字が
n回繰り返す
ab{3}c
p1-6
abbbc
{n,} 直前の文字が
n回以上繰り返す
ab{3,}c
p1-7
abbbc
abbbbc
abbbbbc
{n,m} 直前の文字が
n回以上、m回以下繰り返す
ab{3,4}c
p1-8
abbbc
abbbbc
? 直前の文字が
0回または1回の出現
ab?c
p1-9
ac
abc
[] 括弧内のいずれかの文字にマッチ [abc]
p1-10
a
b
c
[^] 括弧内(先頭の^を除く)の文字以外にマッチ [^abc]
p1-11
x
y
z
| いずれかのパターンにマッチ abc|xyz
p1-12
abc
xyz
() 文字列をグループ化して取得 a(bc|xy)z
p1-13
abcz
axyz

エスケープ

.*などの文字をそのまま表現したい場合は、バックスラッシュ(\)を前に付けてエスケープします。
例えば、\., \*のように使用します。

パターン例 パターン例
(イメージ)
パターン例に
マッチする文字列の例
a\.b p2-1 a.b
\^abc p2-3 ^abc
\^a\[b\.c\*d\+e\]f\|x\?yz\$ p2-3 ^a[b.c*d+e]f|x?yz$

特殊文字

正規表現では、特殊な意味を持つ文字があります。
これらの文字はパターン内で特定の文字やパターンにマッチングするために使用されます。
一部を除き、基本パターンで表現することも可能です。

特殊文字 基本パターン 説明 パターン例 パターン例に
マッチする文字列の例
\d [0-9] 任意の数字にマッチ \d\d
p3-1
12
34
56
\D [^0-9] 任意の数字以外の文字にマッチ \D\D
p3-2
AB
!@
xy
\w [a-zA-Z0-9_] 英数字とアンダースコアにマッチ \w\w
p3-3
ab
A1
_Z
\W [^a-zA-Z0-9_] 英数字とアンダースコア以外の文字にマッチ \W\W
p3-4
#$
?!
\s [ \t\n\r\f\v] 空白文字にマッチ \s\s
p3-5
\t\t
\r\n
\S [^ \t\n\r\f\v] 空白文字以外の文字にマッチ \S\S
p3-6
ab
!@
12
\b 表現不可 単語の境界にマッチ \btest\b
p3-7
test is good
testing
\B 表現不可 単語の境界以外にマッチ \Btest\B
p3-8
attest
stest
testament

実践例

チェック

目的 パターン 結果
数値判定 ^-?\d+(\.\d+)?$
example1-01
≪OK≫
-123456.789
123456.789
0
1
9

≪NG≫
+123456.789
A123456.789
-123456.
.789
携帯番号判定 ^(090|080|070)-\d{4}-\d{4}$
example1-02
≪OK≫
090-1234-5678
080-1234-5678
070-1234-5678
090-9999-9999
090-0000-0000

≪NG≫
060-1234-5678
090-A234-5678
090-1234-567
090-123-5678
09012345678

検索

目的 パターン マッチする文字列
ハッシュタグ検索 #[^\s#]*
example2-01
#test
#正規表現
#はじめてのツイート

参考

https://www.php.net/manual/ja/book.pcre.php
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_expressions

関連書籍

https://amzn.to/3XYtReM
https://amzn.to/3Q4M0FL
https://amzn.to/3Q4NIY2

Discussion