「正規表現」について

正規表現とは

僕は最近、この「正規表現」という言葉を初めて知った。何も知らなかったため、プログラムを全く書けなかった。流石に悔しかったので、今回は正規表現に調べ、実際にプログラムも書いてみた。

正規表現とは、ある特定の文字列が、指定された規則に従っているかの判断をするものだと僕は考えた。

例えば、「abcdefg」という文字列には、「全てが半角英字」、「aで始まる」、「gで終わる」など、様々な規則に従っていることが分かる。プログラムでは、規則を指定し、その規則に合う文字列なら、ある処理を、合わないなら、別の処理をする、というものである。

利用される場面としては、メールアドレスやURLなど、特定の規則に従うものが多い。

プログラムを書いてみる

まず、メールアドレスとURLを例に挙げて、プログラムを書いてみる。

メールアドレスならば、「example@example.com

URLならば、「https://www.example.co.jp/」などがある。

メールアドレスには、最初にランダムな半角英数字が並び、「@」があり、再び、半角英数字が並ぶ。URLには、大体は初めに「http://」、「https://」などの特定の文字列が並び、半角英数字、そして、区切りのスラッシュで構成される。

大方の規則はわかったため、プログラムで書いていこうと思う。今回は「Java」で書いていく。

f:id:kouki-matsuura:20200811030510p:plain

上図は、メールアドレスが適切な形であるかを判定するプログラムである。まず、メールアドレスのルールとしては、「@」よりも前の部分では、様々な記号を利用することができる。しかし、「.」を2つ以上連続してつけることはできない。例外として、「"」で囲めば、2連続以上使用しても問題ないとされている。

このルールを適用した正規表現のパターンを作成する。

まずは、初めに今回、使用する3つのアドレスを宣言している。

次に変数pに、肝となるパターンを書き込んでいく。

初めて見る人には、暗号のようにしか見えないだろう。実際、僕もそうだった。

先頭にある「^(・・・)」はアドレスの最初の形は「・・・」でないといけないという意味である。カッコの中を見ていこう。

([0-9a-zA-Z!#$%&'*+-/=?^_`{}|~]+(.[0-9a-zA-Z!#$%&'*+-/=?^_`{}|~]+)+)

と、書かれている。[0-9]は0から9までという意味である。同様に、a-z,A-Zもaからzの小文字と大文字の意味である。後ろの記号の羅列はシンプルにそのままの記号で捉えてよい。「」で囲まれているところは文字の集まりだと考えてくれれば分かりやすいと思う。このカッコ内にある文字のどれかとマッチすれば「true」となる。「+」は算術演算子ではなく、+の前にある表現を1回以上使うということである。つまり、「で囲まれている記号を1回以上使うこと」である。

次に+から後ろにある、「()」の中身を見ていこう。このカッコは先ほどのものとは違い、「グループ」と捉えてほしい。今回の場合ならば、「.」の後ろには必ず「[0-9a-zA-Z!#$%&'*+-/=?^_`{}|~]+」でなければならないということである。

少し、難しく混乱している人もいると思うが、ずっと見ていると意味がわかるようになると思う。僕も初め見たときは暗号にしか見えなかった。

(\"[^\"]*\"))

「"」がすごく目立っていて、どのような意味かわからない人もいると思う。これは、アドレスのルールで「@」の前の部分では、「"」で囲ってさえいれば、特にルールはないので、「"」があるかどうかが重要になってくる。プログラムではこのマークはコメントなどに使われるため、通常の書き方では、「"」は文字としては扱われない。そのため、「\」を使うことで文字として扱うことができる。これをエスケープ処理という。次に「[^\"]」と書いているが、これは、「"」以外を意味している。よって、「"」で囲み、中には、「"」以外の文字が入っていれば、「true」で返される。

「@」以降は、ほとんど同じなので、説明は割愛する。

これを実行してみると、

example@gmail.com = true
..@gmail.com = false
"example..example"@gmail.com = true

となった。

example@gmail.comは最もシンプルな形である。特にルールに無視したような書き方でないため、trueとなった。

..@gmail.comは、「.」を連続して使えないというルールを無視しているため、falseとなる。

"example..example"@gmail.comは、「"」で囲っているため、「.」が連続していても、問題ないということである。

 

次は、URLの正規表現のプログラムを書いていく。

String str1 = "http://www.example.com/";

        String str2 = "https://www.example.com/";

        String str3 = "example://www.example.com/";

 

        // 正規表現のパターンを作成

        Pattern p = Pattern.compile("^https?://[a-z.:/+-?=&;%~]+$");

上図のプログラムは1つ目を少し、変更しただけである。

適当なURLを3つ並べた。

今回のパターンは先ほどのものと比べ、とてもシンプルになった。URLには、あまりルールがないためである。

先頭は「http」 、「https」のどちらかでないといけないので、「s」の後に「?」をつけることで2パターンに対応できるようにした。あとは「://」の後ろに自由に文字列を並べられるようにした。

結果は下記のようになった。

http://www.example.com/ = true
https://www.example.com/ = true
example://www.example.com/ = false

3つ目は「http」などを用いないため、falseとなっている。これはとても分かりやすいと思う。

以上が今回の例題である。

終わりに

今回は「正規表現」についてわかる範囲でまとめてみた。この記事を書きながらも様々な学びを得ることができたと感じる。

正規表現には、まだまだ色々とルールがあるが、今回の例題でよく使われる部分は補えたと思う。