正規表現とは?正規表現の基本知識についてサンプルを使って解説します
正規表現とは通常の文字と特別な意味を持つ文字を組み合わせることで「先頭がABで始まり末尾がDEで終わる」「Aで始まり3文字から5文字の数字が続く」などの条件に一致するすべての文字列を表すパターンを作成することができるものです。正規表現を使用することで、「ABCと完全に一致する文字列」のように単純な比較だけではなくより複雑な条件に一致する文字列を見つけたり置換したりすることができます。この記事では正規表現の基本的な使い方についての解説をサンプルを使いながら行います。
(2021 年 06 月 25 日公開 / 2021 年 08 月 19 日更新)
目次
- 正規表現とは
- メタ文字の一覧
- 任意の一文字とマッチする(.)
- いずれかの文字とマッチする([...])
- 指定した範囲の文字とマッチする(-)
- 文字列の先頭または末尾とマッチする(^$)
- 直前の文字を繰り返した文字とマッチする(*,+,?,{min,max},{num})
- 複数のパターンのいずれかとマッチする(|)
- パターンの一部をグループ化する((...))
- メタ文字をエスケープする
- バックスラッシュ+文字で改行やタブなどの特別な文字を表す
- バックスラッシュ+文字を使った文字クラスの略記法
- 最大量指定子と最小量指定子(*?,+?,??,{min,max}?)
- 正規表現を使ったサンプル
- 正規表現をWeb上で試すことができるサイト
正規表現とは
正規表現とはある条件にマッチするいつくかの文字列を一つのパターンだけで表す方法です。ある条件というの比較的柔軟に指定することができ、例えば「<p> で始まり任意の文字が続いたあとで </p> で終わる」や「末尾が jpeg または png または webp で終わる文字列」などです。
正規表現は入力されたデータが特定の条件を満たしているかどうかを調べる場合や、長い文章の中から指定した条件に一致するすべての文字列を探し出して置換する、といった用途で使用されます。これらは正規表現を使用せずに特定の文字列と一致するかどうかだけで調べようとすると結構大変な作業になります。
例として文書の中から「Red 、 White 、 Blue のいずれかと一致する文字列」を検索したい場合で考えてみます。正規表現ではこの条件に一致する文字列を次のように表現することができます。(このように正規表現で表した文字列をパターンと呼びます)。
Red|White|Blue
正規表現を使用しない場合、 Red と一致しているか、一致していない場合 White と一致しているか、のように順番に調べていく必要があります。比較する文字列が 3 つだけならまだ順に調べることができても、さらに条件が複雑になった場合は大変です。
それに対して正規表現を使用すれば Red|White|Blue と一致しているかどうか 1 回調べるだけで済みます。条件がさらに複雑になっても正規表現で表すことができれば調べる回数は 1 回だけです。
今度は入力された文字列が郵便番号のフォーマットと一致するか調べてみます。郵便番号は 000-0000 という形式ですので「文字列の先頭から数字が 3 桁続いたあと、ハイフンを挟んで数字が 4 桁続いて終わる文字列」です。正規表現を使うと郵便番号は次のようにパターンとして定義することができます。
^\d{3}-\d{4}$
例えばテキストボックスに入力された文字列を \d{3}-\d{4} と一致するかどうかを調べることで、入力された値が郵便番号として有効な値なのかどうか調べることができます。
なおこの正規表現パターンの中で使用されている ^ 、 { 、 } 、 $ の各文字は特別な意味を持つ文字でメタ文字と呼ばれます。正規表現はこの特別な意味を持つメタ文字を使って複雑な条件を一つの正規表現パターンとして表現します。メタ文字についてはこの記事の後半で詳しく解説します。
メタ文字の一覧
正規表現では条件に一致する複数の文字列を一つのパターンで表すことができます。パターンは a や A や 1 などの通常の文字と、パターンの中で特別な意味を持つメタ文字を組み合わせて作成します。
メタ文字にもいくつかの種類あります。一つの文字で複数の文字を表すことができるものや、文字の個数を指定できるもの、そして文字が現れる位置を指定できるものなどです。この記事で解説するメタ文字の一覧は次のとおりです。
メタ文字 | 解説 | 記述例 | マッチする文字列 |
---|---|---|---|
. | 任意の一文字とマッチする | A.C | ABC, ADC |
[...] | いずれかの文字とマッチする | A[BCD]E | ABE, ADE |
- | 指定した範囲の文字とマッチする | ABC[D-G] | ABCD, ABCF |
* | 直前の文字が0回以上連続する文字とマッチする | AB*C | AC, ABBBC |
*? | 直前の文字が0回以上連続する文字とマッチする(最小量指定子) | AB*?C | AC, ABBBC |
+ | 直前の文字が1回以上連続する文字とマッチする | AB+C | ABC, ABBBC |
+? | 直前の文字が1回以上連続する文字とマッチする(最小量指定子) | AB+?C | ABC, ABBBC |
? | 直前の文字が0回または1回現れる文字とマッチする | AB?C | AC, ABC |
?? | 直前の文字が0回または1回現れる文字とマッチする(最小量指定子) | AB??C | AC, ABC |
{min,max} | 直前の文字をmin回以上max回以下繰り返す文字にマッチする | AB{2,4}C | ABBC, ABBBBC |
{min,max}? | 直前の文字をmin回以上max回以下繰り返す文字にマッチする(最小量指定子) | AB{2,4}?C | ABBC, ABBBBC |
{num} | 直前の文字をnum回繰り返す文字にマッチする | AB{3}C | ABBBC |
| | 複数のパターンのいずれかとマッチする | AB|CD|EF | AB, CD, EF |
(...) | パターンの一部をグループ化する | A(BCD)+ | ABCD, ABCDBCDBCD |
正規表現で利用可能なメタ文字は、正規表現が利用できるすべてのツールやプログラミング言語で同じように利用できるとは限りません。使えないメタ文字があったり、メタ文字の意味が微妙に異なるものがありますのでご注意ください。
それぞれのメタ文字の使い方について JavaScript による簡単なサンプルを使って解説していきます。
任意の一文字とマッチする(.)
メタ文字の「.」は任意の 1 文字とマッチします。文字はアルファベットでも数字でも漢字でも構いません。
例えば正規表現パターン B.D は「B のあとに任意の一文字が続き、そのあとに D が続く」文字列とマッチします。
const regex = /B.D/; regex.test('BAD'); >> true regex.test('BED'); >> true regex.test('BD'); >> false regex.test('BAND'); >> false
BAD や BED とマッチしますが、 BD や BAND とはマッチしません。
いずれかの文字とマッチする([...])
メタ文字の [...] は角括弧の中に記述した複数の文字のいずれかの文字とマッチします。 [ABC] だった場合は A,B,C のいずれの文字、 [ABCDE]だった場合は A,B,C,D,E のいずれかの文字とマッチします。
例えば正規表現パターン [Aa]pple は「A または a の文字のあとに pple が続く」文字列とマッチします。
const regex = /[Aa]pple/; regex.test('Apple'); >> true regex.test('apple'); >> true regex.test('Bpple'); >> false regex.test('App'); >> false
このパターンがマッチするのは Apple または apple だけです。
否定(^)
角括弧の先頭にキャレット(^)を記述すると、角括弧の中に記述した文字以外の文字とマッチします。 [^ABC] だった場合は A,B,C の 3 つの文字以外の文字とマッチします。否定の意味でキャレット(^)を使用する場合は角括弧の中の先頭に記述する必要があります。
例えば正規表現パターン [^Aa]pple は「A または a 以外の文字のあとに pple が続く」文字列とマッチします。
const regex = /[^Aa]pple/; regex.test('Apple'); >> false regex.test('apple'); >> false regex.test('Bpple'); >> true regex.test('App'); >> false
Bpple や 9pple が含まれる文字列とマッチますが、 apple または Apple とはマッチしません。
指定した範囲の文字とマッチする(-)
メタ文字の - をメタ文字の [...] の中で使用すると範囲を表すメタ文字となります。メタ文字の - を使用すると 0 から 9 までのいずれかの文字と一致する正規表現パターン [0123456789] は [0-9] と記述することができます。同じように a から z までのいずれかの文字と一致するパターンは [a-z] 、 A から Z までのいずれかの文字と一致するパターンは [A-Z] と記述できます。
例えば正規表現パターン 201[0-9] は「201 の文字のあとに 0 から 9 までのいずれかと一致する文字が続く」文字列とマッチします。
const regex = /201[0-9]/; regex.test('2012'); >> true regex.test('2018'); >> true regex.test('201X'); >> false regex.test('2022'); >> false
2012 や 2018 が含まれる文字列とマッチしますが、 2022 や 201X にはマッチしません。
角括弧の中で範囲を表すメタ文字と通常の文字を混在させることもできます。例えば A から E までのいずれかの文字か N か Y の文字とマッチさせたい場合は [A-ENY]のように記述できます。
範囲を表すメタ文字と別の範囲を表すメタ文字を混在させることもできます。例えば a から z までの文字と A から Z までの文字のいずれかの文字とマッチさせたい場合は [a-zA-Z] のように記述できます。
数字またはアルファベットのいずれかの文字とマッチする「a-zA-Z0-9」というパターンはよく使用されます。例えば正規表現パターン DATA[a-zA-Z0-9] は「DATA の文字のあとに数字またはアルファベットの文字が続く」文字列とマッチします。
const regex = /DATA[a-zA-Z0-9]/; regex.test('DATAX'); >> true regex.test('DATA7'); >> true regex.test('DATA@'); >> false regex.test('DATA光'); >> false
DATAX や DATA7 などにはマッチしますが、 DATA@ や DATA光 など記号や漢字が最後に付く文字にはマッチしません。
文字列の先頭または末尾とマッチする(^$)
メタ文字の「^」は文字列の先頭とマッチします。またメタ文字の「$」は文字列の末尾とマッチします。特定の文字ではなく、文字が現れる位置とマッチする点に注意してください。
例えば正規表現パターン ^py は「文字列の先頭から py が続く」文字列とマッチします。
const regex = /^py/; regex.test('python'); >> true regex.test('pylon'); >> true regex.test('copy'); >> false regex.test('happy'); >> false
python や pylon とマッチしますが、 copy や happy とはマッチしません。
正規表現パターン py$ は「文字列の末尾に py がある」文字列とマッチします。
const regex = /py$/; regex.test('python'); >> false regex.test('pylon'); >> false regex.test('copy'); >> true regex.test('happy'); >> true
copy や happy とマッチしますが、 python や pylon とはマッチしません。
「^」と「$」を組み合わせることもできます。正規表現パターン ^ham$ は「文字列が ham で始まり終わる」文字列とマッチします。
const regex = /^ham$/; regex.test('ham'); >> true regex.test('hammer'); >> false regex.test('gingham'); >> false
このパターンがマッチするのは ham だけです。 hammer や gingham とはマッチしません。
直前の文字を繰り返した文字とマッチする(*,+,?,{min,max},{num})
直前の文字を指定した回数繰り返した文字とマッチするメタ文字のことを量指定子と呼びます。量指定子には 「*」, 「+」 , 「?」, {min,max}, {num} の 5 種類が用意されておりそれぞれ使い方を見ていきます。
直前の文字が0回以上連続する文字とマッチする(*)
メタ文字の「*」は直前の文字が 0 回以上連続する文字列とマッチします。 0 回でもマッチするため直前の文字がなくてもマッチします。
例えば正規表現パターン Go*l は「G のあと o が 0 回以上続きそのあとで l が続く」文字列とマッチします。
const regex = /Go*l/; regex.test('Gl'); >> true regex.test('Gol'); >> true regex.test('Gooool'); >> true regex.test('GML'); >> false
Gl や Gol や Gooool が含まれる文字列にマッチします。メタ文字「*」の直掩の文字が現れなくてもマッチする点に注意してください。
直前の文字が1回以上連続する文字とマッチする(+)
メタ文字の「+」は直前の文字が 1 回以上連続する文字列とマッチします。
例えば正規表現パターン Go+l は「G のあと o が 1 回以上続きそのあとで l が続く」文字列とマッチします。
const regex = /Go+l/; regex.test('Gl'); >> false regex.test('Gol'); >> true regex.test('Gooool'); >> true regex.test('GML'); >> false
Gol や Gooool が含まれる文字列にマッチしますが、 Gl にはマッチしません。
直前の文字が0回または1回現れる文字とマッチする(?)
メタ文字の「?」は直前の文字が 0 回または 1 回現れる文字列とマッチします。
例えば正規表現パターン Go?l は「G のあと o が 0 回または 1 回現れたあとで l が続く」文字列とマッチします。
const regex = /Go?l/; regex.test('Gl'); >> true regex.test('Gol'); >> true regex.test('Gool'); >> false regex.test('Gooool'); >> false
Gl か Gol が含まれる文字列とだけマッチします。 Gool や Goooool にはマッチしません。
直前の文字をmin回以上max回以下繰り返す文字にマッチする({min,max})
メタ文字の {min,max} は直前の文字を min 回以上 max 回以下繰り返す文字列にマッチします。どちらか片方だけを指定することもできます。
{min,max} 直前の文字を min 回以上 max 回以下繰り返す {min,} 直前の文字を min 回以上繰り返す {,max} 直前の文字を max 回以下繰り返す
例えば正規表現パターン BA{2,4}N は「B のあと A が 2 回以上 4 回以下繰り返したあとで N が続く」文字列とマッチします。
const regex = /BA{2,4}N/; regex.test('BAN'); >> false regex.test('BAAN'); >> true regex.test('BAAAN'); >> true regex.test('BAAAAN'); >> true regex.test('BAAAAAN'); >> false
BAAN か BAAAN か BAAAAN とだけマッチします。 BAN や BAAAAAN にはマッチしません。
正規表現パターン BA{3,}N は「B のあと A が 3 回以上繰り返したあとで N が続く」文字列とマッチします。
const regex = /BA{3,}N/; regex.test('BAN'); >> false regex.test('BAAN'); >> false regex.test('BAAAN'); >> true regex.test('BAAAAAN'); >> true
BAAAN や BAAAAAN とが含まれる文字列とマッチします。 BAN や BAAN にはマッチしません。
直前の文字をnum回繰り返す文字にマッチする({num})
メタ文字の {num} は直前の文字を num 回繰り返す文字列にマッチします。
例えば正規表現パターン BA{3}N は「B のあと A が 3 回繰り返したあとで N が続く」文字列とマッチします。
const regex = /BA{3}N/; regex.test('BAN'); >> false regex.test('BAAAN'); >> true regex.test('BAAAAAN'); >> false
BAAAN が含まれる文字列マッチします。 BAN や BAAAAAN にはマッチしません。
複数のパターンのいずれかとマッチする(|)
メタ文字の「|」は複数のパターンを | で区切って記述する場合に使用し、記述された複数のパターンのいずれかとマッチした場合にマッチします。 AB|CD|EFG と記載した場合は、対象の文字列が AB または CD または EFG と一致した場合にマッチします。
例えば正規表現パターン RED|BLUE|YELLOW は「RED または BLUE または YELLOW のいずれかが含まれる」文字列とマッチします。
const regex = /RED|BLUE|YELLOW/; regex.test('RED'); >> true regex.test('BLUE'); >> true regex.test('YELLOW'); >> true regex.test('WHITE'); >> false
RED または BLUE または YELLOW が含まれる文字列とマッチします。
パターンの一部をグループ化する((...))
メタ文字の (...) はパターンの中の一部をグループ化することができます。主な使い方としてはメタ文字の「+」や「*」と組み合わせる場合とメタ文字の「|」と組み合わせる場合があります。それぞれ見ていきます。
メタ文字の「+」は直前の文字が 1 回以上連続する文字とマッチします。対象となるのは直前の 1 文字ですが、グループ化を使用すると直前にあるグループ内のパターンを 1 回以上連続する文字列とマッチさせることができます。
例えば正規表現パターン AB(CDE)+F は「AB のあとに CDE という文字列が 1 回以上続き、そのあとに F が続く」文字列とマッチします。
const regex = /AB(CDE)+F/; regex.test('ABCDEF'); >> true regex.test('ABCDECDECDEF'); >> true regex.test('ABCDEEF'); >> false
ABCDEF や ABCDECDECDEF が含まれる文字列とマッチします。
メタ文字の「|」は複数のパターンを | で区切って記述する場合に使用し、記述された複数のパターンのいずれかとマッチした場合にマッチします。グループ化を使用すると、パターンの中でどこからどこまでが選択肢なのかを明確にすることができます。
例えば正規表現パターン (2021|令和3)年 は「2021 または 令和3 のあとに 年 が続く」文字列とマッチします。
const regex = /(2021|令和3)年/; regex.test('2021年'); >> true regex.test('令和3年'); >> true regex.test('2019年'); >> false
2021年 や 令和3年 が含まれる文字列とマッチします。
もしグループ化を行わずに 2021|令和3年と記述してしまうと、 2021 または 令和3年 のいずれかが含まれる文字列とマッチするパターンになってしまいます。
メタ文字をエスケープする
正規表現のパターンの中で「.」や「+」などのメタ文字は特別な意味を持ちます。これらのメタ文字を単なる文字として扱いたい場合には、バックスラッシュを使ったエスケープ処理を行います。
エスケープを行うにはメタ文字の前にバックスラッシュ(\)を記載してください。
\. \+ \* \? \|
例えば正規表現パターン example.com は「example のあとに任意の 1 文字が続き、そのあとに com が続く」文字列とマッチします。
const regex = /example.com/; regex.test('example.com'); >> true regex.test('examplexcom'); >> true regex.test('example@com'); >> true
example.com のほかに examplexcom ような文字列でもマッチします。
ここで「.」をエスケープして正規表現パターン example\.com とした場合は「example.comと一致する」文字列とマッチします。
const regex = /example\.com/; regex.test('example.com'); >> true regex.test('examplexcom'); >> false regex.test('example@com'); >> false
エスケープされたことで「.」はメタ文字の「.」ではなく文字の「.」としての意味しか持たなくなるので、 example.com にはマッチしても examplexcom にはマッチしません。
バックスラッシュ+文字で改行やタブなどの特別な文字を表す
対象の文字列の中には改行が含まれていることもあり、改行も含めた部分にマッチするような正規表現パターンが必要となることがあります。改行やタブといった特別な文字はアルファベットや記号を使って表現することができませんが、バックスラッシュ(\)+文字の組み合わせで改行やタブを表すパターンを作成することができます。
具体的には次のような組み合わせが用意されています。
\f 改ページ \n 改行 \r 復帰 \t タブ \v 垂直タブ
改行を表すにはバックスラッシュ(\)と n の組み合わせで表すことができます。
例えば正規表現パターン hello\nbye は「hello のあとに改行が続き、そのあとに bye が続く」文字列とマッチします。
const regex1 = /hello\nbye/; const regex2 = /hellobye/; const str = `hello bye`; regex1.test(str); >> true regex2.test(str); >> false
改行を含む文字列に対して hello\nbye はマッチしました。
バックスラッシュ+文字を使った文字クラスの略記法
数字とマッチするパターンは [0-9] と記述することができますが、このような数字、英数字とアンダーバー、空白文字、にそれぞれマッチするパターンをバックスラッシュ(\)+文字の組み合わせで簡潔に記述できるように定義されています。
具体的には次のような組み合わせが用意されています。
\d 数字 [0-9] \D 数字以外 [^\d] \w 英数字とアンダーバー [0-9a-zA-Z_] \W 英数字とアンダーバー以外 [^\w] \s 空白文字 [ \f\n\r\t\v] \S 空白文字以外 [^\s]
数字とマッチするパターン [0-9] の代わりに \d と記述することができます。逆に数字ではない文字とマッチするパターンは \D と記述することができます。
例えば正規表現パターン 090-\d{4}-\d{4} は「090で始まり、ハイフン(-)のあとで数字が 4 個続き、ハイフン(-)のあとで再度数字が 4 個続く」文字列とマッチします。
const regex = /090-\d{4}-\d{4}/; regex.test('090-1234-5678'); >> true regex.test('090-123A-5678'); >> false regex.test('090-1234-567'); >> false
今回のパターンは 090-[0-9]{4}-[0-9]{4} と記述した場合と同じです。
最大量指定子と最小量指定子(*?,+?,??,{min,max}?)
メタ文字の中で「+」や「*」などの直前の文字を繰り返した文字とマッチするメタ文字を量指定子と呼びます。量指定子が含まれるパターンの場合、対象の文字列の中で複数の箇所でマッチする場合があります。
例えば正規表現パターン u.+c は「u のあとに任意の文字が 1 回以上続き、そのあとに c が続く」文字列とマッチします。対象の文字列が Lunch is curry rice だった場合、パターンはこの文字列とマッチしますが、パターンがマッチする箇所は次の 3 箇所が考えられます。
Lunch is curry rice Lunch is curry rice Lunch is curry rice
いずれも条件を満たすのですが、パターンの中で単に「+」と記述した場合はなるべく多くの文字列とマッチしょうとします。そのため、次の箇所でマッチします。
Lunch is curry rice
実際に JavaScript の簡単なサンプルを使ってマッチした部分を取得してみます。
const regex = /u.+c/; let result = regex.exec('Lunch is curry rice'); console.log(result[0]); >> unch is curry ric
結果は一番多くの文字列とマッチしました。このような量指定子を特に最大量指定子と呼びます。
* + ? {min,max}
最小量指定子
先ほどとは逆にパターンが対象の文字列の中でマッチする箇所が複数ある場合に、一番少ない文字列のところでマッチさせることもできます。量指定子である 「*」, 「+」, 「?」, {min,max} ではなく、それぞれ「?」を追加して 「*?」、 「+?」、 「??」、 {min,max}? を使用します。
*? +? ?? {min,max}?
実際に試してみます。最小量指定子を使った正規表現パターン u.+?c は対象の文字列 Lunch is curry rice とマッチしますが、なるべく少ない文字列のところでマッチしようとします。そのため、次の箇所でマッチします。
Lunch is curry rice
実際に JavaScript の簡単なサンプルを使ってマッチした部分を取得してみます。
const regex = /u.+?c/; let result = regex.exec('Lunch is curry rice'); console.log(result[0]); >> unc
結果は一番少ない文字列とマッチしました。
単にマッチするかどうかを調べる場合は気にされなくてもいいのですが、マッチした部分を取得したり置換したりする場合で、パターンの中に量指定子が含まれている場合は、最大量指定子を使用するか最小量指定子を使用するのかを考えて使用してください。
正規表現を使ったサンプル
正規表現で目的に応じてパターンを定義しておくと、電話番号や郵便番号を入力するテキストボックスで、ユーザーによって入力された値が電話番号や郵便番号のフォーマットに一致しているか確認する場合などに使用できます。ここではよく使用される正規表現のパターンをご紹介します。
10進数
入力された値が 10 進数の数値かチェックするには次のパターンを使用します。
^[0-9]+$
^\d+$
このパターンでは「文字列の先頭から数字が 1 文字以上連続し末尾となる文字列とマッチします。
const regex = /^[0-9]+$/; regex.test('3'); >> true regex.test('2791'); >> true regex.test('47A'); >> false
16進数
入力された値が 16 進数の数値かチェックするには次のパターンを使用します。
^[0-9a-fA-F]+$
このパターンでは「文字列の先頭から数字 または a から f または A から F が 1 文字以上連続し末尾となる文字列とマッチします。
const regex = /^[0-9a-fA-F]+$/; regex.test('b9'); >> true regex.test('3A0B'); >> true regex.test('45G0'); >> false
8進数
入力された値が 8 進数の数値かチェックするには次のパターンを使用します。
^[0-7]+$
このパターンでは「文字列の先頭から 0 から 7 の数字が 1 文字以上連続し末尾となる文字列とマッチします。
const regex = /^[0-7]+$/; regex.test('5'); >> true regex.test('741'); >> true regex.test('904'); >> false
2進数
入力された値が 2 進数の数値かチェックするには次のパターンを使用します。
^[01]+$
このパターンでは「文字列の先頭から 0 か 1 の数字が 1 文字以上連続し末尾となる文字列とマッチします。
const regex = /^[01]+$/; regex.test('1'); >> true regex.test('10010'); >> true regex.test('204'); >> false
英数字
入力された値が英数字かチェックするには次のパターンを使用します。
^[0-9a-zA-Z]+$
このパターンでは「文字列の先頭から 0 から 9 の数字か a から z のアルファベットか A から Z のアルファベットが 1 文字以上連続し末尾となる文字列とマッチします。
const regex = /^[0-9a-zA-Z]+$/; regex.test('Hello'); >> true regex.test('500Yen'); >> true regex.test('user@example'); >> false
ひらがな
入力された値がひらがなかチェックするには次のパターンを使用します。
^[\u3040-\u309F]+$
※ Unicode でひらながを表す文字は \u3040 から \u309F の範囲にあります。
このパターンでは「文字列の先頭から \u3040 が表す文字から \u309F が表す文字までの文字が 1 文字以上連続し末尾となる文字列とマッチします。
const regex = /^[\u3040-\u309F]+$/; regex.test('こんにちは'); >> true regex.test('ありがとう'); >> true regex.test('グッド'); >> false
カタカナ
入力された値がカタカナかチェックするには次のパターンを使用します。
^[\u30A0-\u30FF]+$
※ Unicode でカタカナを表す文字は \u30A0 から \u30FF の範囲にあります。
このパターンでは「文字列の先頭から \u30A0 が表す文字から \u30FF が表す文字までの文字が 1 文字以上連続し末尾となる文字列とマッチします。
const regex = /^[\u30A0-\u30FF]+$/; regex.test('グッド'); >> true regex.test('サンキュー'); >> true regex.test('ありがとう'); >> false
漢字
入力された値が漢字かチェックするには次のパターンを使用します。
^[\u4E00-\u9FFF]+$
※ よく使用される漢字は Unicode \u4E00 から \u9FFF の範囲にありますが、この範囲に含まれない漢字も存在します。また「々」「〆」「〇」を含める場合は ^[\u4E00-\u9FFF\u3005-\u3007]+$ を代わりに使用してください。
このパターンでは「文字列の先頭から \u4E00 が表す文字から \u9FFF が表す文字までの文字が 1 文字以上連続し末尾となる文字列とマッチします。
const regex = /^[\u4E00-\u9FFF]+$/; regex.test('東京都千代田区'); >> true regex.test('十二月'); >> true regex.test('花飾り'); >> false
郵便番号
入力された値が郵便番号のフォーマットと同じかチェックするには次のパターンを使用します。
^[0-9]{3}-[0-9]{4}$
^\d{3}-\d{4}$
このパターンでは「文字列の先頭から 数字が 3 文字続き、ハイフン(-)が続き、さらに数字が 4 文字続いたあと末尾となる文字列とマッチします。
const regex = /^[0-9]{3}-[0-9]{4}$/; regex.test('453-0006'); >> true regex.test('100-8606'); >> true regex.test('75-22546'); >> false
携帯電話の電話番号
入力された値が携帯電話の電話番号のフォーマットと同じかチェックするには次のパターンを使用します。
^0[789]0-[0-9]{4}-[0-9]{4}$
^0[789]0-\d{4}-\d{4}$
このパターンでは「文字列の先頭から 070 または 080 または 090 で始まり、ハイフン(-)のあとに数字が 4 文字続き、さらにハイフン(-)のあとに数字が 4 文字続いたあと末尾となる文字列とマッチします。
const regex = /^0[789]0-[0-9]{4}-[0-9]{4}$/; regex.test('090-1234-5678'); >> true regex.test('070-8765-4321'); >> true regex.test('090-123-45678'); >> false
正規表現をWeb上で試すことができるサイト
最後に正規表現を Web 上で試すことができるサイトを 3 つご紹介します。それぞれ正規表現パターンと対象の文字列を入力することで、マッチするかどうか、マッチした場合にどの部分とマッチしたのかを確認することができます。
pythex
pythex は Python 環境での正規表現を試すことができます。
・Pythex: a Python regular expression editor
Rubular
Rubular は Ruby 環境での正規表現を試すことができます。
・Rubular: a Ruby regular expression editor
Regex101
Regex101 は PCRE や JavaScript 環境での正規表現を試すことができるチェッカーです。 PCRE とは Perl Compatible Regular Expression の略で Perl5 互換の正規表現ライブラリのことです。 PHP では正規表現として PCRE を利用しています。
・Online regex tester and debugger: PHP, PCRE, Python, Golang and JavaScript
-- --
正規表現の基本的な使い方について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
初心者~中級者の方を対象としたプログラミング方法や開発環境の構築の解説を行うサイトの運営を行っています。