39
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

新人プログラマーの軌跡 #5 正規表現チートシート

Last updated at Posted at 2016-06-30

この2週間は
テストサイトの作成、ローカル開発環境・データベース・正規表現のお勉強を主にしていました。
テストサイトの作成は実務で、
ローカル開発環境MySQL正規表現はドットインストールで主に学習をしました。

ローカル開発環境やMySQLはまだ混乱している部分が多いので、もう少し時間を頂戴すべく
今回は正規表現の基本をまとめようと思います。

#正規表現
正規表現とは、数字などとメタ文字を用いた表現方法の1つです。
それを利用して、検索対象の文字列から目的の文字列を探し出します。
門戸は広そうであるが掘ればなかなか難しそうな正規表現について、見ていきます。

##文字指定

文字指定 意味
 . 任意の一文字 \nを除く
\n 改行
\t タブ
\  メタ文字の前に置くとメタ文字をエスケープする
\w すべての半角英数字とアンダースコア
\W 半角英数字とアンダースコア以外すべて
\d すべての半角数字
\D 半角数字以外すべて
\s 空白文字(半角スペース、\t、\n、\r、\f)すべて
\S 空白文字(半角スペース、\t、\n、\r、\f)以外すべて

###例①

aaaaaaaaaa

bbbbbb
cccc

ddddddd

^\n ⇒   や \n\n ⇒ \n とすると

aaaaaaaaaa
bbbbbb
cccc
ddddddd

と空行が消えてくれます。
   
###例②

〒123-4567


\d\d\d-\d\d\d\d や \d{3}-\d{4}
と指定すると、郵便番号にマッチします。
また{}を使った方法については後述します。

##量指定子
同じパターンが何度も繰り返す場合に使えます。

量指定子 意味
+ 前の文字を1回以上繰り返す
* 前の文字を0回以上繰り返す
? 前の文字を0or1回繰り返す 量指定子の後に置くとマッチパターンが最小になる
{m} m回繰り返す
{m,} m回以上繰り返す
{,n} n回以下繰り返す
{m,n} m回以上n回以下繰り返す

###例①

Google
Gogle
Gooooooooooooogle
Gooooooooogle
Ggle
Goooogle

o の数がめちゃくちゃな文字列に
Go*gle ⇒ Google や Go{0,20}gle ⇒ Google
とすると

Google
Google
Google
Google
Google
Google

元通りになりました。

##グループ指定

グループ指定 意味
[ ] [ ]内のいずれか一文字
[^ ] [ ]内に含まれないいずれか一文字
?: ( )の初めに使うとキャプチャは行わず、グループ化のみ行う
( ) ( )内を$1に格納 ( )は複数設置可能
$1 ( )に格納された文字列 ※置換後の文字列中で使用可能
\1 ( )に格納された文字列 ※検索の文字列中で使用可能

###例①

ぶるんる ぶるんる ぶるんる
はるちるがる とるぶる
おるいるけるのる まるわるりるにる
のるばるらるがる さるいるたるよる
ぶるんる ぶるんる ぶるんる
はるちるがる とるぶる

昔よく遊んで歌いましたね。だが、「る」が入っていて見づらい。
ならば「る」を抜きましょう。

そこで
(.)る ⇒ $1
とすると、おなじみの

ぶん ぶん ぶん
はちが とぶ
おいけの まわりに
のばらが さいたよ
ぶん ぶん ぶん
はちが とぶ

が現れました。

##アンカー

アンカー 意味
^ 行頭にマッチする
$ 行末にマッチする

###例①

aasooijgesreoihj@gmail.jp

ドメインが変ですね。

そこで
jp$ ⇒ com
とすると

aasooijgesreoihj@gmail.com

になります。行末がjpの部分にマッチしたのですね。

##前後読み

前後読み 意味
(?<=hoge) 左側にhogeが存在する箇所
(?<!hoge) 左側にhogeが存在しない箇所
(?=hoge) 右側にhogeが存在する箇所
(?!hoge) 右側にhogeが存在しない箇所
言語によってはサポートしていないツールがあるので、注意が必要です。

###例①

出発地:東京都 → 目的地:京都

ここで、目的地を宮崎に変更したいと思い
京都 ⇒ 宮崎 と変換すると、

出発地:東宮崎 → 目的地:宮崎

となってしまいます。
東京都の京都にもマッチングしてしまったのですね。

そこで
(?<!東)京都 ⇒ 宮崎
とすると

出発地:東京都 → 目的地:宮崎

と見事、変換成功です。京都の左が東出ない場合にマッチしたのですね。

##オプション
オプションはまだ把握しきれていないですが・・・

オプション 意味
i 大文字小文字の区別をしない
g 一致した部分すべてに適応
m 複数行に対応

#まとめ
最初は気難しそうに見えた正規表現だが、まとめてみるとそんなに量もなくルールを知らないだけだったのかもしれません。
あとは時間がかかっても辛抱強く正規表現を使い、どれほど便利なのかを身に沁みさせる必要があります。
また言語の違いにより表記方法が変わってくるので、そこはその都度対応しなければなりません。

だけど今後、どんなことが出来るようになるのか楽しみです。

#参考文献
正規表現クイズ
(http://www.nurs.or.jp/~lionfan/reg2/)
サルにもわかる正規表現入門
(http://www.mnet.ne.jp/~nakama/)
手を動かしながら覚える正規表現
(http://doc.mas3.net/regexp/)

39
40
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?