正規表現って忘れた頃に突然必要になりますね。勉強するする詐欺になってましたが仕事で必要になったので、この機会にはじめての正規表現とベストプラクティス#1: 基本となる8つの正規表現を元に備忘録的にまとめました
実行環境
正規表現はRubularを使うとさっと試せます
直前文字検索
?か+を使用して直前の文字を検索することができます。
ただし?は直前文字が0でもヒットするので、
ユーザー?と検索するとユーザもユーザーもヒットします
| メタ文字 | 意味 |
|---|---|
| ? | 直前の文字が0文字もしくは1文字以上あるメタ文字 |
| + | 直前の1文字が「1個以上」繰り返されることを表すメタ文字 |
例
検索対象:コンピュータ コンピューター コンピューターー
| 検索 | 検索結果(太文字が検索結果) |
|---|---|
| コンピューター? | コンピュータ コンピューター |
| コンピューター+ | コンピュータ コンピューター コンピューターー |
繰り返し回数指定
直前文字の繰り返し回数を指定したい場合は{N,M}のようにすれば回数を指定できます
| メタ文字 | 意味 |
|---|---|
| {N,M} | 直前の1文字が「N個以上M個以下」繰り返されることを表す |
例
文字列: aー aーー aーーーー aーーーーー
| 検索 | 検索結果(太文字が検索結果) | 備考 |
|---|---|---|
| aー{2,4} | aー aーー aーーーー aーーーーー | ーを2から4回繰り返す |
| aー{2,} | aー aーー aーーーー aーーーーー | ーを2回以上繰り返す |
検索したい文字に間に何か入っている場合
例えばシーチキンおにぎりを検索したいとします。でも世の中にはシーチキンマヨネーズおにぎりが巷にあふれています。その場合、単にシーチキンおにぎりを検索してもヒットしません。シーチキンとおにぎりを両方検索するとマッチはしますが、冗長です。こんな時に任意の文字が入ってもヒットする検索方法があります
最長一致
よく、ファイル名をtmp_日付とか何か.txtといったように接頭文字を入れることがあります。
こういう時に.+を使用してtmp_.+.txtと
.+を入れることでtmp_と.txtの間に任意の文字が入っても検索できます
例
| 検索 | 検索対象 | 検索結果(太文字が検索結果) |
|---|---|---|
| temp_.+.txt | temp_aa.txt | temp_aa.txt |
| temp_bb.txt | temp_bb.txt | |
| temp_.txt | temp_.txt | |
| temp_.jpg | temp_.jpg |
最長一致
ただし.+は
例えば柿食う客。みかん食う客。の文で柿とその客をヒットさせたい場合に、
柿.+食う客と検索すると、全てヒットしてしまします(最長一致)
最短一致
.+?はヒットした最短を返却できます
例えば柿食う客。みかん食う客。の文で柿とその客をヒットさせたい場合に、
柿.+?食う客と検索すると、柿食う客。がヒットできます(最短一致)
例 あ、柿食う客。を見る柿を食う客
| 検索 | 検索結果(太文字が検索結果) | 備考 |
|---|---|---|
| 柿.+食う客 | あ、柿食う客。を見る柿を食う客 | 最後の食う客と最初のあ、柿の間に任意の文字があると見なされる。 |
| コンピューター+ | あ、柿食う客。を見る柿を食う客 |
食う客より前を検索し、すぐに見つかった柿がヒットしたら、それを検索結果とする |
ということで最初のシーチキンマヨネーズおにぎりに対してシーチキンとおにぎりを元に検索したい場合はシーチキン.+?おにぎりとすればいい感じかと
指定文字検索
検索したい文字を指定したい場合[]で囲むと、文字のどれか一文字を検索します。順番は問いません。ただし一文字だけしかヒットさせません。[]+とすることで長さを任意にすることができます
例
あ、柿も食う客。を見る柿を食う客。そして柿をも食う客
| 検索 | 検索結果(太文字が検索結果) | 備考 |
|---|---|---|
| 柿[もを]食う客 | あ、柿も食う客。を見る柿を食う客。そして柿をも食う客 |
柿をもはヒットしない |
どちらかを検索
文字列のうち一方が引っかかってくれれば良い場合を考えます。
(xyz|abc)とするとxyzとabc内のどちらかが引っかけます。
ただしxyzabcと連続している場合は引っ掛けれません。いわゆるXOR論理です。
条件内は文字順が変わるとヒットしません(zyxはヒットしない)
例
あ、柿をも食う客。みかんをも。かんみをも。柿みかんをも
| 検索 | 検索結果(太文字が検索結果) | 備考 |
|---|---|---|
| (柿 | みかん)をも | あ、柿をも食う客。みかんをも。かんみをも。柿みかんをも |
この時柿みかんをもを引っ掛けたいときは
(柿|みかん|柿みかん)をもとする必要があります。
注意点
(xxx|yyy|)と最後に|を入れてしまうバグがあります。これよくやります。
これをしてしまうと文字と文字の間がヒットしてしまい、検索結果が悲惨な結果になります
エスケープ
+ , ?そのものを検索したい時にはバックスラッシュを直前に加えます
ちなみに\はmacでは「option」+「¥」でできます
例
1+1をヒットさせたい
1\+1