意味が分からず使っていた正規表現が理解できてスッキリ

fire-684014_1280
LINEで送る
Share on GREE
Share on LinkedIn

正規表現ってなんで正規表現なんでしょう?
英語で言うと「Regular Expression」
正規表現って文字列のマッチングをする時に利用する記述方法なのに、何故それが正規の表現なのか・・・
考えていると何とも悩ましいのですが、あまり細かいことは気にしない性格なので、正直もうどうでもよく思えてきました。
 

そんな僕が、今まで仕事で何となく書いていた正規表現のリファレンスページを見てようやく理解できたので、メモしておきます。

そもそも正規表現についての調査

wikipediaで見てみると、下記のように書かれている。

プログラムにおいて、文字列をパターンマッチングする機能

 

正規表現機能は、ほぼ全てのプログラム言語に存在している。
そして言語毎に若干の書き方は違うものの、原理原則は同じであるため、プログラミングスキルとして重要な要素であることがわかる。
 

もちろん、正規表現を使わずに、文字列の分解や判定を独自にコーディングして、同じ結果を出すことは可能だが、文字列マッチングするだけであれば、正規表現機能を使ってサクッと書けるとよりプログラミングレベルが高い事が、他人のソースコードを見ていてもよく分かる。

どういう場面で使うことが多いのか?

個人的に利用シーンが多いのは、javascriptでWEBページにおける入力フォームのバリデーションチェックをリアルタイムに行う場合に使います。
 

メールアドレスのバリデーションチェックの正規表現記述

/^[-!#$%&+\.\/0-9=?A-Z^_’a-z{|}~]+@[-!#$%&+\.\/0-9=?A-Z^_’a-z{|}~]+\.[-!#$%&+\.\/0-9=?A-Z^_’a-z{|}~]+$/gi

非常に長くて分かりにくいんですが、ポイントは下記の2点です。

「*@*.*」というフォーマットになっているかどうか
英数記号判定「-!#$%&+\.\/0-9=?A-Z^_’a-z{|}~」

 
内容が分かってしまえば簡単なのですが、実はメールアドレスのグランドルールとして、「.(ドット)で始まってはいけない」というのがあるのですが、過去にdocomoのimodeでユーザーが好き勝手にメールアカウントを発行できた時代で、.(ドット)で始まるアカウント制御を行なっていなかった為、携帯電話で.(ドット)で始まるアカウントが存在してしまっているため、こうしたバリデーションチェックでは、その処理が入れられないという裏事情も、仕事をして初めて知りました。

URLのバリデーション判定

/^(http|https)(:\/\/)(.*?)\.([\w|.\-+_])(.*)/gi

 
これは解説をしなくても分かりやすいと思うので、説明は割愛します。

今回の課題

今回は、上記に書いてある

(.*?)

の部分の意味がよく理解できていなくてなんとなく使っていたのですが、よくわからなかった点が下記の内容です。

. : 改行以外の文字列にマッチ
* : 0回以上の繰り返しにマッチ
? : 直前の文字の0回か1回にマッチ

 

上部のURL判定などの場合、個人的な理解で使っていたのは「http://hoge.com/index.html」の「index.html」はDocumentRootのインデックス設定で割愛することができるので、その場合は「(.*?)」としますが、ドメイン部分のように必ず何かしらの記述がある場合は「(.+?)」とするようにしていました。
簡単に書くと、下記のようになります。

「http://(.+?)/(.*?)」

 

この場合に、「*」と「?」の違いが分からなかったという点と「?」は何故付けなければいけないのかが理解できていませんでした。
 

今回理解できたのは、「?」を付け無いと、1文字しか対象に判定されなく、「?」を付けることによって、複数文字に対して同時にチェックすることが可能になるという事です。
 

ネット上にある便利な正規表現確認ツールを使ってみると非常によくわかります。
PHP: preg_match() / JavaScript: match() 正規表現チェッカー ver3.0
 

PHPとJavascriptでの結果違いも表示されていて、とても分かりやすいです。
 

個人的に、こうしたツールを言語別に作っておくことで、プログラミング効率もアップするという事が理解できました。
 

あ、そうそう、今回のアイキャッチ、「マッチング」のマッチね・・・

Leave a Reply

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


*