正規表現って忘れた頃に突然必要になりますね。勉強するする詐欺になってましたが仕事で必要になったので、この機会にはじめての正規表現とベストプラクティス#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