やすくて速い正規表現(Easy Regular Expression)

正規表現の構成と意味、ジャバスクリプト(Javascript)でのお扱い

正規表現というのは検索パータンを指定し記号で表示したものです。

このアイデアはアメリカの数学者であるスティーブンコールクリーン(Stephen Cole Kleene)が1950年代に正義した正規言語(Regular Language)と関係がありまして、正規表現の文法は1980年代にパール(Perl)言語から使い始まりました。

主に、検索や置換の作業に使われ、皆が使うほとんどのプログラミング言語の中でサポートされている文法です。

例えば、次の文章の中で特定した条件を検索するとき正規表現の力を借りることができます。

The greatest danger for most of us is not that our aim is too high and we miss it, but that it is too low and we reach it.

  • ‘too’ 文字列を検索する -> /too/
    The greatest danger for most of us is not that our aim is too high and we miss it, but that it is too low and we reach it.
  • 大、小文字を構わなく ‘t’ 文字を検索するとき -> /t/-gi
    The greatest danger for most of us is not that our aim is too high and we miss it, but that it is too low and we reach it.
  • ‘d’ から始まる単語及び文字のすべてを検索するとき -> /[d]\w+/-gi
    The greatest danger for most of us is not that our aim is too high and we miss it, but that it is too low and we reach it.
  • ‘ea’を含む単語を検索するとき -> /[a-z]*ea[a-z]*/-i
    The greatest danger for most of us is not that our aim is too high and we miss it, but that it is too low and we reach it

正規表現の文法テストは次のページが助かります。

regexr.com

青いバーExpressionの下のインプットには表現を入れ書き、その下のボックスには検索対象になるテキストを入れればオッケーです。

まず、表現の意味について少し勉強してからJavascriptで楽に使う方法を確認してみます。


1. 正規表現の記号

  • / . / → すべての文字
  • / + / → 一つ以上の文字
  • / ? / → 0または一つの文字
  • / ^ / → 該当の文字を除く
  • / / → 範囲指定
  • / * / → 0または一つ以上の文字
  • / [ ] / → グループセット
  • / { } / → 繰り返しの回数指定
  • / \ / → エスケープ
  • / \d / → すべての数字
  • / \D / → 数字ではない文字
  • / \w / → アルファベット、数字、アンダーバー
  • / \W / → アルファベット、数字、アンダーバーではない文字
  • / \s / → 空白文字
  • / \S / → 空白ではない文字
  • / \n / → 改行

基本的に正規表現を構成する記号は上記であり、この記号さえ覚えれば正規表現の基本的な仕組みは十分理解できると思います。

それではサンプルを参考しながら正規表現を分析していきましょう。


2. 記号の意味

正規表現で一番基礎になる記号であるので覚えておくと役に立ち部分です。

dは数字、 wは英文字、 sは空白、 nは改行の意味であり、各文字の大文字は NOT(反対)を示します。

  • 数字が一回以上繰り返す文字検索 ? / [\d]+ /
  • 数字ではない文字を検索(空白含む) ? / [\D] /
  • 括弧(かっこ)が含まれている文字、数字検索 ? / \([\w]+\) /
  • 英文字、数字、アンダーバーではない文字検索 ? / [\W]+ /
  • 空白検索 ? / \s /

上で紹介したregexr.comで検索対象になるテキストをいれてパータンを直接に作成してみるとすぐ正規表現になれると思います。


大体エスケープというのは何ですかね。

キーボードの一番左一番上のキー(ESCと書かれているもの)がエスケープの略字です。エスケープの意味は逃れるのです。

こちらでは約束から逃れることだと認識すればいいと思いです。

例えば、正規表現で点(. dot)はすべての文字の意味にしようと約束した特別な文字ですね。

でもたまには’それ約束以外’に点をピリオド意味の点で使いたいときがありますね。

この時エスケープを使います。

エスケープを使わない限り、文字は約束した機能として動きます。

下の例で確認しましょう。

  • すべての文字を意味。 a, b, c, d, ?, !, @, , などすべての文字の中一つ ? / . /
  • エスケープを前につけるとただピリオド記号だけの意味 ? / \. /
  • 一つ以上の文字の意味 ? / + /
  • エスケープを前につけるとただプラス記号だけの意味 ? / \+ /

エスケープはよく使われる必須な機能であるので、そのままの文字にはならないのでエスケープが必要な特別な文字(. ? + *など)を覚えておく必要があります。

その文字の一部を下で紹介します。


上で紹介した特別な記号は特別な意味を持ちます。代表的な使い方は下の通りです。

  • 小文字a~z或は大文字A~Z中一致する英文字検索 ? / [a-zA-Z] /
  • color或はcolourを検索(‘u’があってもなくてもいい) ? / colou?r /
  • ‘a’を含む単語検索 ? / [\S]*a[a-zA-Z]* /
  • a-z或は空白(space)ではない文字検索 ? / [^a-z ] /
  • 英文字から始め必ず数字または特殊記号を含む文字列を検索 ? / [a-zA-Z]+[\d!@#\$%\^*]+[\w]* /

中括弧は繰り返しの回数を指定し、これを使うと詳しい検索パータンの設定が可能です。

中括弧の中、一つの数字は全体の繰り返し回数の意味であり、二つの数字は頭と末の範囲を指定する意味です。

例え、{3}は3回繰り返しの意味であり、{1, 3}は範囲区間1から3の意味です。

{1, }のような表現も可能であり、これは+記号と同様な意味, つまり一つ以上の意味であります。

  • Aが3回繰り返す文字を検索 ? / [A]{3} /
  • 3桁以上の数字を検索(3번以上繰り返し) ? / [\d]{3,} /
  • Aが二回から三回まで繰り返す文字を検索(繰り返す範囲指定) ? / [A]{2,3} /

繰り返し回数だけを指定すれば、意図しない結果が出ることがあるので、部分式(subexpression)と全後方一致検索を一緒に使うともっと効果的なパータンが可能です。


角かっこの中に記号を書き、検索パータンを指定します。直接に記号を書き込んだり、範囲指定記号の’-‘を使ってパータンを指定します。

  • 指定する文字(a 或は A 或は b 或は B 或は c 文字)一つを検索 ? [aAbBc]
  • aから eまで(a,b,c,d,e)の範囲内一つの文字を検索 ? [a-e]
  • 除外文字’^’があるので a-z 範囲に入らない文字(記号)を一つ検索 ? [^a-z]
  • 明記した記号の一つを検索 ? [?!@#$%^&*()_]
  • c或はCから始め, a-zの中一つで終わる単語検索 ? [cC][a-z]

[ ]を使うと一つだけの文字を検索するので一つ以上の文字を検索したいときには+記号(一つ以上の文字、0は不可)または*(0または一つ以上の文字、0も可能)記号を付ける必要があります。

  • 一つ以上のa-z文字を検索(必ず一つ以上の条件) ? [a-z]+
  • 0個以上のA-Z文字を検索(なくてもいい) ? [A-Z]*

特定構成で成り立つ文字列の検索に効果的であり、例えばメールアドレスの文字列があります。

メールアドレス形式のabcd@xyz.comを検索するためには次のようなパータンを使うことができます。

/[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]+/

では、パータンを分析してみます。

先、メールのIDになる部分は英文字と数字が入るので、[a-zA-Z0-9]で始め一つ以上を意味する+記号を付けます。

その次、@が続きますので@を入れ, ホストのアドレスも一つ以上の英文字と数字を指定します。

.com形のアドレスなのでピリオドをそのまま使うためエスケープを使いまた一つ以上の英文字を入れてパータンを生成します。

もしIDの中に点が入るかホストアドレスが.co.jpなどの形になるときにはそれに対する応用が必要です。



3. まとめ

正規表現の第一印象はまるで外界言語みたいな姿で広く使われる既存の言語とは違う様子をしてますね。

軽く近づけられなくいやな気持がするときもありますが、少しだけでも調べてみたら意外と簡単な規則でパワフル機能を持っていいやつだなと思われる時が来るかもですね。

上で紹介した部分は代表的な機能を紹介するため簡単なパータンたちなので、上のパータンは不完全なパータンであります。もの正しいパータンを作るためにはもっと深く勉強する必要がありますね。

ご質問がありましたら、自由にコメントください!

あざーす!