世界一わかりやすい正規表現入門

いきなりですが、正規表現とはいろんな文字を1つのルールに落とし込んだものです。

例えば福井県を文字であらわすとき、福井県、ふくいけん、フクイケン、FUKUIKENなどなど、いろんな書き方ができますよね。
これを一つにまとめたい!というときに使えるものが正規表現です。

まとめてみると
私は(福井県|ふくいけん|フクイケン|FUKUIKEN)出身です。
↑のようにしておけば、私はのあとにどんな方式が来ようと、福井県出身なんだと判別することができます。
ほかにもいろいろなパターンがありますので詳しく見ていきましょう。

目次

正規表現で使う文字

. * + ?^ $ [ ] | ( )

上記はメタ文字とばれるもので、これらと一般的な文字列を組み合わせることパターンを決定するものが正規表現です。
※常に半角です。

カンマは何でもいい1文字

.←カンマはなんでもいい1文字を表します。
例えば

.....

↑はわかりにくいですがカンマが5つ並んでいます。
意味としては”なんか5文字”です。
この5文字なんでもいいです。
“こんにちは”でも”ありがとう”でも”ふくいけん”でも、どれでも一致します。

アスタリスクは制限なしの繰り返し

*←アスタリスクは繰り返しを意味します。
制限なしの繰り返しです。
例えば

ふ*

↑は”ふ”でも”ふふふふふ”でも”ふふふふふふ”でも一致します。
さらに言えば、”ふくくくく”でも”ふ000くく”でも一致します。
なんなら、”ああああ”でも”0000″でも一致します。

本来は直前の文字がないか、直前の文字が1個以上連続するを意味するため、あ*のように一文字だけだと実質なんでも当てはまってしまいます。

もちろんカンマと組み合わせれば

.*

なんでもいい文字が何個か続いているものという意味になります。
つまり、文字なら何でもOKということになります。

他にも

ふく*

とすれば、”ふ”は確定で”く”がなんでもいい繰り返しの対象になるので、これは実質”ふ”から始まる何かになります。
ここで注意したいのは、”ふ”が文字列の先頭であるという意味にはならないという点です。

※ちなみにExcelなどよく使われるワイルドカードと似ていますがちょっと違います。
ふく←はExcel的には”ふく”の前後がなんでもよいという意味ですが、正規表現的には”ふ”が入った文字列です。

プラスは制限ありの繰り返し

アスタリスクはなんでもありでしたが、それでは
ふく*が”ふふい”でも一致してしまうことになり困ってしまいます。

そこで便利なのが+(プラス)です。

アスタリスクとは違い、直前の文字が最低1つはないと成立しません。

ふく+

↑のように書けば、これは必ず”ふく”が含まれていることになります。
“ふくい”とか”ふくいけん”とかに一致します。

ふが固定で、くが1つ以上繰り返す文字列となります。

?(はてな)はまったくないか1個あるか

アスタリスクやプラスの繰り返すという特性はメリットでもありますが、使いにくい場合もあります。
例えば単数形、複数形です。
book
books
のどちらかであればOKとしたい場合に、アスタリスクやプラスだけでは実現できません。

“bookssss”とか”bookkk”とかでも一致してしまうからです。

そこで便利なものが?(はてな)です。

books?

としておけば
bookかbooksの時に一致とできます。

?は直前の文字がないか、1文字あるかだけを指定できます。
直前の文字”s”がない、もしくは”s”が一文字だけあるとき
つまり、bookかbooksだけが対象となります。

先頭を表す^(キャレット)

にっこりマークとしてもおなじみの^(キャレット)ですが、正規表現では文字列の先頭を意味します。

例えば

^ふ.*

このように書くと、”ふ”から始まる何かしらの文字列という意味になります。

^(キャレット)はキーボードのどこ?

マイナスの右です。
0の2個右です。

$(ドル)は終端

先頭があれば当然、終端もあります。
アメリカの通貨、$(ドル)です。

先ほどの例に追加すると

^ふ.い$

これは”ふ”で始まり、”い”で終わる文字列です。
.としているため文字数はなんでもいいです。
3文字にしたければ

^ふ.い$

です。

ORやまたはを表す|(パイプ)

縦棒こと|(パイプ)は、ORやまたはを表します。

福井県|ふくいけん|フクイケン|FUKUIKEN

↑は福井県 OR ふくいけん OR フクイケン OR FUKUIKEN
と同じ意味です。

|(パイプ)はキーボードのどこ?

キャレットの右隣りかつshiftです。

大カッコは範囲内のどれかを表す。

大カッコは範囲内のどれかに合致するかを判定します。

こちらは実用例を見てみましょう。
[A-Z]
[a-z]
[0-9]
よくみるやつですよね。
ちなみに、”-“で間を省略しています。
[A-Z]の実体は[ABCDEFGHIJKLMNOPQRSTUVWXYZ]です。

で、これは何を意味しているかというと
[ABCDEFGHIJKLMNOPQRSTUVWXYZ]
↑リストのうちどれか1つ、つまりは大文字のアルファベットかどうかということです。

[a-z]は小文字、[0-9]は数字です。

どれか以外

ややこしい話をします。

先頭を表すキャレットですが、大カッコのなかにいれると否定になります。
どういうことだ。。。?と思うかもしれませんが、私にもわかりません。
[^A-Z]
は大文字アルファベット以外のどれかという意味になります。

先頭という意味はなくなり、以外という意味になります。

()カッコはグループを表す

これまでの正規表演は直前1文字であったり、範囲内の1文字もしくは特定の文字列であったりしました。
とはいえ、実務では複数文字の繰り返しを判定したいなんてこともあります。

そんな時に便利なものが()です。
これはグループ化してくれます。

例えば

(ふく)+

とすれば”ふく”の繰り返しという意味になり、”ふくふく”とか”ふくふくふく”にしか合致しません。

これがどういうときに便利かといいますと、一番初めに書いた

私は(福井県|ふくいけん|フクイケン|FUKUIKEN)出身です。

のような文の時です。

()を外してしまうと
私は福井県|ふくいけん|フクイケン|FUKUIKEN出身です。
となり
私は福井県 OR ふくいけん OR フクイケン OR FUKUIKEN出身です。
というめちゃくちゃな意味になってしまいます。

()を使えば、先に()内を計算し、そのあとで全体文字列となるため
私は (福井県 OR ふくいけん OR フクイケン OR FUKUIKEN) 出身です。
↑のように求める形になってくれます。

おわり

お疲れ様です。

Comment

コメントする

目次