LoginSignup
1
1

More than 5 years have passed since last update.

[正規表現]頻出しそうな正規表現のまとめ

Last updated at Posted at 2019-03-23

正規表現って忘れた頃に突然必要になりますね。勉強するする詐欺になってましたが仕事で必要になったので、この機会にはじめての正規表現とベストプラクティス#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)とするとxyzabc内のどちらかが引っかけます。
ただしxyzabcと連続している場合は引っ掛けれません。いわゆるXOR論理です。
条件内は文字順が変わるとヒットしません(zyxはヒットしない)


あ、柿をも食う客。みかんをも。かんみをも。柿みかんをも

検索 検索結果(太文字が検索結果) 備考
(柿 みかん)をも あ、柿をも食う客。みかんをも。かんみをも。柿みかんをも

この時柿みかんをもを引っ掛けたいときは
(柿|みかん|柿みかん)をもとする必要があります。

注意点

(xxx|yyy|)と最後に|を入れてしまうバグがあります。これよくやります。
これをしてしまうと文字と文字の間がヒットしてしまい、検索結果が悲惨な結果になります

エスケープ

\
+ , ?そのものを検索したい時にはバックスラッシュを直前に加えます
ちなみに\はmacでは「option」+「¥」でできます


1+1をヒットさせたい
1\+1

1
1
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
1
1