【正規表現】基本正規表現&拡張正規表現~基本的な記述から繰り返しや後方参照まで~

こんにちは。関東の大学に通う大学生ミンチ(@programminchi)です。今回は、正規表現について見ていきましょう。この記事では基本正規表現(BRE)と拡張正規表現(ERE)について見ていきます。

 

 

正規表現の意味

まずは正規表現の意味について見ていきましょう。

 

正規表現とは、特定の文字列の集合や特定の文字列のパターンを表現するための表記法である。
出典:IT用語辞典バイナリ

 

初めて聞いた人はこれだけでは少し分かりにくいかもしれません。
要は、色々な文字列を特殊な文字(メタキャラクタ)を使って1つの文字列で表してしまおうってものです。

 

1つ例を見ていきましょう。

[ ]は間に挟まれた文字のいずれか1つにマッチするメタキャラクタですが例えばa[abc]cという正規表現があった時、この正規表現はaac、abc、accの3つの文字列にマッチします。

 

 

基本正規表現(BRE)

まずは基本正規表現について見ていきましょう。

 

BREのメタキャラクタ(特殊文字)

基本正規表現におけるメタキャラクタを以下に羅列します。

\     ^     $     .     [   ]     *     \{     \}     \(     \)

メタキャラクタはこれ自体が特別な意味を持ちます。メタキャラクタを通常の文字として扱いたい時は\をメタキャラクタの前につけます。

 

BREの基本

以下にBREの中でも基本となる正規表現を表にまとめました。

 

基本正規表現 簡単な説明
[....] [ ]で囲まれた文字の内、いずれか1つの文字にマッチする。
 . 任意の1文字にマッチする。
[0-9] 数字1文字にマッチする。
 [a-z] 英小文字1文字にマッチする。
 [a-zA-Z] 英文字1文字にマッチする。
 [^A-Z] 英大文字以外の1文字にマッチする。
 ^ 行の先頭を表す。
$ 行末を表す。
s* 正規表現sの0回以上の繰り返しを表す。

 

ここでいくつか補足をしていきます。

まず、[ ]内先頭にある^とそれ以外の^は全く別のものなので、気を付けてください。[ ]内先頭にある場合は、[ ]内の文字にマッチしない1文字を表します。

 

また、正規表現s*についてもう少し詳しく説明します。これは、メタキャラクタ*の直前にある正規表現が0回もしくは1回以上現れるということです。

例を示すと、w[0-9]*wという正規表現があるとします。この場合、*の直前の正規表現は[0-9]です。

よってこれが0回以上繰り返されます。具体的にはww、w0w、w1w、w00w、w01wなどに当てはまります。

 

繰り返し、後方参照

次に、繰り返し、後方参照に関する正規表現を見ていきましょう。以下の表にまとめました。

 

基本正規表現 簡単な説明
\{n\} 直前の正規表現がn回表れる。
\{n,\} 直前の正規表現がn回以上繰り返される。
\{n,m\} 直前の正規表現がn回以上m回以下繰り返される。
 \(s\) 正規表現sにタグ付けをする。
 \a  a番目のタグ付け正規表現を表す。

 

まず繰り返しの例を挙げます。b\{2\}はbbにマッチします。

[0-9]\{2,3\}は[0-9]を2回以上3回以下繰り返すので00、01、000、001など2桁以上3桁以下の数字にマッチします。

 

次に後方参照の例を挙げます。\(ab\)\1という正規表現があるとします。

ここでabという文字列にタグ付けがされており、その後ろで1番目のタグ付け正規表現、つまりabがもう一度呼び出されているので、この正規表現はababにマッチします。

 

 

拡張正規表現(ERE)

次に拡張正規表現(ERE)について見ていきましょう。拡張正規表現は名前の通り、基本正規表現を拡張したものになっています。

基本正規表現と大きく異なるわけではないですが、ちょいちょい異なる部分があるので、以下の表にまとめます。

 

拡張正規表現では+や?などの新しいメタキャラクタが出てくるので、それについても覚えておいてください。

拡張正規表現
+ 直前の正規表現が1回以上繰り返される。
? 直前の正規表現が0回か1回表れる。
{n} 直前の正規表現をn回繰り返す。
{n,} 直前の正規表現をn回以上繰り返す。
{n,m} 直前の正規表現をn回以上m回以下繰り返す。

 

まず+について説明します。これは*と似ていますが、直前の正規表現が少なくとも1回は現れます。

?について、直前の正規表現が0回か1回表れるので、例えばhttps?という正規表現があった時、この正規表現はhttp、もしくはhttpsにマッチします。

 

下の3つに関しては基本正規表現の書き方が変わっただけなので分かるでしょう。

 

 

まとめ

正規表現はほとんどのプログラミング言語にライブラリとして備わっていたり、色々なところで出てくる大事な概念です。

文字列の置換や検索にも役に立ち、覚えていて損はないのでこの機会にしっかり覚えてしまいましょう。

今回は基本正規表現と拡張正規表現についてとりあげましたが、他にもいくつかの正規表現が存在しているので、興味のある人は各自調べてみてください。

 

今後も定期的にコンピュータ系の記事を発信していくので是非、興味のある人はツイッターの方もフォローお願いします!!


2 件のコメント

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です