1.正規表現って何なの?

 突然ですが皆さん、「正規表現」って知ってますか? まだ使ってないなんて、もったいない! 例えるなら、スマホのカメラ機能みたいなもんですよ。使いこなせば、ネットの海に散らばるアヤシイ文字列たちを、面白いほど一瞬で探し出せるんです!

 例えば、最近、推しのアイドルがSNS始めたんだけど、ファンってみんな色々な呼び方するじゃないですか。「〇〇ちゃん」「〇〇様」「〇〇たん」、中には熱烈なファンすぎて「ガチ恋」勢もいたりして…😅 もしあなたが、推しに関する色んな書き込みを全部まとめてチェックしたいと思ったとしましょう。

 でも、「〇〇ちゃん」で検索して、「〇〇様」で検索して…って、気が遠くなりませんか? ましてや「ガチ恋」なんてワードで検索したら、あなたのタイムラインが大変なことになっちゃうかも…!😟

 そこで正規表現の出番!こんな感じの魔法の呪文を唱えれば…

〇〇(ちゃん|様|たん|ガチ恋)?
 あら不思議!「〇〇」でも「〇〇ちゃん」でも「〇〇様」でも「〇〇たん」でも、まさかの「ガチ恋」まで、ぜーんぶまとめて見つけ出せるんです!

 どうですか?なんだか、推し活が超捗りそうな予感がしませんか?😅 ちょっと難しそうに見えるかもしれませんが、この入門書を読めば、あなたも今日からネットの海を自由自在に旅する情報マスターになれる…かも!? さあ、一緒に正規表現の冒険に出かけましょう!
 

2.正規表現の裏番長!クセの強い特殊文字たち

 さて、そんな文字列をまとめて表現するスゴ技「正規表現」ですが、その裏側には、ちょっと特別な力を持った文字たちが潜んでいるんです。まるで、影で活躍するスパイのような存在ですね!

 こいつらがその特殊能力を持った文字たち!みんな半角だからね!
 


.   ^   $   [   ]   *   +   ?   |   (   )

 
 こいつらは正規表現界のメタ文字と呼ばれてて、まあ簡単に言うと「ただの文字じゃねぇんだよ!」っていう、ちょっと反抗期みたいな連中です。「メタ」っていうのは、例えるなら「マジ卍」のマジみたいなもんで、「ハンパなく特別」って感じ?普通の文字にプラスアルファの意味が込められてると思ってください。

 でもね、困ったことに、このメタ文字たちって普通の文章にも平気で顔を出すんですよ。例えば、あなたが、何かと話題のあの実業家について、ちょっとだけ意見を言いたいと思ったとしましょう。

「最近の E*** M*** 氏の動向には、色々と考えさせられるなぁ…」

 って書いたとします。これ、言わずもがな、あのテスラとかX(旧Twitter)のCEOのことですよね?(世界中の注目を集めるあの…)

 で、この控えめな意見を正規表現で検索しようとして、そのまま

 「最近の E*** M*** 氏の動向には、色々と考えさせられるなぁ…」
って検索しても、思ったようにヒットしないことがあるんです…😔(;´Д`)
  もうお察しだと思いますが、この伏字に使われている *マークが、文字としての「アスタリスク」じゃなくて、「直前の文字が0回以上繰り返される」っていう、メタ文字としての特殊能力を発揮しちゃうからなんです。ね?なんだか、宇宙開発のロケットみたいに、予測不能な動きをするってことかもしれませんね!(強引な解釈)
  だから、もしこれらのメタ文字を、ただの文字として扱いたい場合は、そのメタ文字の前に、\(半角のバックスラッシュ)を付ける必要があります。これは「エスケープ」というテクニックで、メタ文字の特殊能力を一時的に封印するイメージ。「おっと、炎上は勘弁!」みたいな感じでしょうか?(笑) 下の表で確認してみてください。
 

\.  \^  \$  \[  \]  \*  \+  \?  \|  \(  \)
  なお、\ 自体は、\\と書きます。



3.メタ文字の種類

 では、メタ文字を種類ごとに解説していきます。以下、具体例で示していきます。わかりやすくするため大きな文字を使用していますが、メタ文字はすべて半角です。

(1)なんでもいい1文字     .

半角の .を使用すると、なんでもいい1文字を表現することができます。
正  規  表  現   私は.です
検索できる文字列の例
  私はです   私はです  私は0です

つまり、下線の文字の部分がなんでもいいことになります。

「正規表現」の書きかたひとつで、「検索できる文字列の例」がすべて検索できるということです。

さらに、これを応用してみます。

正  規  表  現   私は.....
検索できる文字列の例
  私はうどん嫌い   私は早起き苦手
…と、 .を繋げることでいろんな表現が可能になるのがおわかりになるでしょう。
しかし、 . そのものを検索したい場合がありますね。例えば、TEST.LOG を検索したい場合などですね。この場合は、
正  規  表  現   TEST\.LOG
検索できる文字列の例   TEST.LOG
つまり、.の前に\を付けることで、.を正規表現の.ではなくて、単なるひとつの文字のとしての.という意味に変えることができるのです。

(2)行の先頭と最後  ^ $

 
行の先頭や最後にのみ存在する文字列を検索したい場合があります。
例1
 今日はありがとうございました。
例2  
 ありがとうと言いたい
例3
 君に心よりありがとう

これらの例に対して、
正  規  表  現
  ^ありがとう 

によって検索すると、合致するのは例2だけとなります。

つまり、半角の ^ は、行の先頭を意味します。ですから、この「正規表現」の場合は、行の先頭に存在する「ありがとう」の文字しか検索しないのです。

逆に、

正  規  表  現  
 ありがとう$ 
の場合は、 $ が行の終わりを意味します。この例では行の終わりにある「ありがとう」しか検索しません。ですので、合致するのは、例3だけとなります。

 また、以下のようにこの両方を同時に指定した場合、   

正  規  表  現
 ^ありがとう$ 

とすると、「ありがとう」の文字だけのある行に合致します。
なお、行頭にある普通の文字の ^ 、行末にある $ を検索したい場合は、それぞれ
 
正  規  表  現
 ^^ 
正  規  表  現
 $$  

として下さい。
これからもおわかりのように、^は正規表現の先頭、$は終端のものしかメタ文字として認識されません。

(3)同じ文字の繰り返し  * + ?

同じ文字の繰り返しを表す正規表現は、 *   +   ?   の3つあります。
正  規  表  現   おー*
検索できる文字列の例
 おい  おーーい  おーーーーい
この例からもわかりますように、 * は、* の直前の文字がないか、直前の文字が1個以上連続するという意味になります。

ここで注意して頂きたいのですが、ファイル名を指定する時のワイルドカードで使用される * とは、意味が異なります。

ワイルドカードの * では、「おー*い」は、

      おーい  おーーい  おーーーーい

などと同等の意味になります。

 すなわち、* は直前の文字がなんであろうと関係なく、「ー」の後の文字がまったくなくて「い」が来ているか、どんな文字でもいいから、1個以上の文字が「ー」の後に続いて、最後に「い」が来ているかが問題になります。
 

正  規  表  現   おー+
検索できる文字列の例
 おーい  おーーい  おーーーーい

+ の場合は、* とは違い、最低でも1個は + の直前の文字がないといけません。
後は、それが連続するという意味になります。
 

正  規  表  現   おー?
検索できる文字列の例
 おい  おーい 

? の場合は、直前の文字がまったくないか、1つだけあるという意味です。

これはどういう場合に便利かと言いますと、
 

正  規  表  現
 @?elonmusk
検索できる文字列の例
 elonmusk   @elonmusk

と言う風に、SNSのユーザー名を検索する際に、先頭に「@」が付いている場合と付いていない場合のどちらにも合致させたい場合に利用できます。
 

正  規  表  現   iPhone ?15
              ↑
半角のスペースがない場合も考えられます。
検索できる文字列の例
 iPhone15  iPhone 15

と言う風に、製品名などで、スペースが入るかどうか不明な文字列を検索する場合にも利用できます。

 *+? は、少しずつ違うので、その違いを理解して下さい。




(4)なんでもいい文字の連続.*

さて、 * + ?  の正規表現は、「(1)とにかくなんでもいい1文字」のところで説明しました、 . と併用することができます。
正  規  表  現  やっぱり.*が一番
検索できる文字列の例  やっぱり推しが一番
 やっぱりうちの猫が一番
 やっぱり焼肉が一番

 この例では、「やっぱり」で始り、「が一番」で終わる文字列を検索しています。
. は、とにかくなんでもいい1文字の意味でしたね。そして、* は、* の直前の文字がないか、連続する場合でしたね。
そこで、 .* というのは、とにかくなんでもいい1文字がまったくないか、連続するかという意味になります。とにかくなんでもいい文字が連続すると言うのは、つまりは、いろんな文字の連続と言うことになります。

そこで、上の例の場合は、「やっぱり」で始り、「一番」までの文字列ということになる訳です。

言わば、これが、ワイルドカードで使用される * と同じ意味を持つ正規表現ということになります。
上記の「やっぱり.*が一番」のような使用例は、特定のフレーズで始り、その後にどんな言葉が続いても良い場合に有用です。
+  ?  についても、それぞれ併用効果は違いますが、直前の文字が . ということでなんでもいい1文字ということになります。

それぞれ適用できる場面があるかと思いますので、考えてみて下さい(^_^)。

.*はどこまで繋がるのか】

さて、ここでひとつ疑問が起きます。以下の例に対して、
 


 楽しいかもね、そうかもね

以下の正規表現で検索すると、
 

正  規  表  現  楽.* 

合致するのは、「楽しいかもね」まででしょうか?それとも「楽しいかもね、そうかかもね」でしょうか?

正解は、「楽しいかもね、そうかもね」までです。
つまり、.*というのは、可能な限り合致するものまで繋がるのです。
従って、正規表現の最後に.*が来た場合は、行の最後まで合致することになります。
 

(5)いずれかの文字列  |

さて、今までの(1)~(4)までの正規表現は、1文字に対して機能するものばかりでした。

今度は、複数の連続する文字について適用される正規表現を見ていきます。
 

正  規  表  現
 X|Instagram|TikTok|Facebook
検索できる文字列の例
 X Instagram TikTok Facebook

つまり、| で区切られた文字列のいずれかの文字列が存在した時に、正規表現に合致したことになります。

 この | はいくらでも並べられますが、実際は、ソフトによっては処理能力に限界がある場合もありますので、あまりにも多くの選択肢を並べるのは避けた方が賢明でしょう。




(6)指定した文字のどれか [ ]

 
例1
 明日は晴です
例2  
 明日は曇です
例3
 明日は雨です
例4
 明日は雪です
 
これらの例に対して、
 
正  規  表  現
 明日は[晴曇雨]です 

の場合は、合致するのは、例1、例2、例3です。例4は合致しません。

つまり、 [ ] で括られた中の文字は、その中のどれか1つに合致する訳です。

これが、もしも、「(1)とにかくなんでもいい1文字」のところで説明した半角の . を使用すると、
 

正  規  表  現  明日は. です 

ということになると、例1から例4までのすべてが合致します。

しかし、たとえば、すべての数字とか、すべてのアルファベットを指定したい時、
 

正  規  表  現
 [ABCDEFGHIJKLMNOPQRSTUVWXYZ]CCC 

とか、
 

正  規  表  現
 [0123456789]CCC 

と書けなくもありませんが、これは非常に面倒ですね。

まあ、これだけならばいいですが、今度は全角のABCDE…も同時に指定したい場合には、もう表現のしようがありません。

 でも、ご安心下さい。こんな場合に備えて、
 

正  規  表  現
 [A-Z]CCC 
正  規  表  現
 [0-9]CCC 

というような書きかたもあります。

この中の、 [A-Z] と言うのは、A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Zの文字のどれかということになります。同じように、[0-9]は、0,1,2,3,4,5,6,7,8,9の文字のどれかということになります。

ですので、はじめの例では、Aで始り、2番目の文字が半角の大文字のアルファベットが来て、最後はCCCの文字が来るものということになります。同じように、その次の例では、Aで始り、2番目の文字が半角の数字が来て、最後はCCCの文字が来るものということになります。

これだと、非常に複雑なことも書けますね。

この書きかたは、連続して書けますので、
 

正  規  表  現
 [A-Z0-9]CCC 

と書けば、Aで始り、次の文字が半角の大文字アルファベットか数字で、CCCで終わる文字列の検索ができる訳になります。

ところが、今度は逆に上記のはじめの例で言うと、第2番目の文字が半角のアルファベット以外を指定したい場合があります。

はい、これも実は書きかたがあります。
 

正  規  表  現
 [^A-Z]CCC 

と書けば、Aで始り、2番目は半角アルファベット以外の文字で、最後はCCCというものを探してくれます。

これもまた、連続して書けますので、
 

正  規  表  現
 [^A-Z0-9]CCC 

とすれば、2番目の文字は、アルファベットと数字以外の文字ということになります。このように[ ]の中で ^ が使用された場合は、行の先頭を表す ^ とは意味が異なりますので注意して下さい。

さて、今までの例は半角でしたが、全角の場合はどうでしょうか?
 

正  規  表  現   [か-こ]
検索できる文字列の例
  たかこ  たきこ  たけこ

この例では、2文字目は、「か き く け こ」の内のいずれかの文字が該当するはずです。

しかし、現実には、「たこ」にも「たこ」には合致します。これはどういうことでしょうか?

[か-こ]というのは、日本語の50音の並びに基づいているのではないということなのです。それは、JIS漢字コード表の並びに基づいているのです。

JIS漢字コード表の並びを見てみますと、下記のようになっています。
 

か行のJIS漢字コード表
 か が き ぎ く ぐ け げ こ
 

つまり、[か-こ]の文字というのは、単純に か き く け こ の文字ではなくて、上記の文字の中のどれかということになるわけです。

ですから、半角の場合はあまり問題になることはありませんが、全角の並びの場合は、必ずしも50音の順にはなってはいないということに注意して下さい。

できましたら、[か-こ]のような使用をされる場合は、JIS漢字コード表を参照されることをお勧めします。

ちなみに、[弌-熙]は第2水準の漢字のいずれかという意味です。

ここでちょっと注意すべき事があります。それは、[ ]の中ではメタ文字は普通の文字として認識されると言うことです。従って、メタ文字を普通の文字として探させたい場合でも、わざわざ直前に \ を付ける必要はありません。ただし、]\ につきましては例外です。以下に例を示しますと…
 

正  規  表  現  [.*] 
検索できる文字列の例  . * のいずれかの文字。いずれの文字もメタ文字ではない。
 
正  規  表  現
 [ABC^] 
 
検索できる文字列の例
 A,B,C,^ のいずれかの文字。^はメタ文字ではない。

^ は文字として認識させたい場合は、必ず[ ]の中の2番目以降に記載のこと。先頭に書くと、上記で説明したように^に続く文字を否定する意味のメタ文字になってしまいます。
 

正  規  表  現
 [^^4]
 
検索できる文字列の例
  ^ と 4 以外の文字。

このように [ ] の中の先頭文字 ^ に続く ^ はその文字自体を否定する。
 

正  規  表  現
 [[567] 
検索できる文字列の例
 [,5,6,7の文字のいずれか。
 
正  規  表  現
 [\]567] 
検索できる文字列の例
 ],5,6,7の文字のいずれか。

このように[ ] の中で [ ] の文字を指定した場合は、[ はそのままで問題ないが、] の場合は \] と記述しないと誤検索します。
 

正  規  表  現
 [\\PR] 
検索できる文字列の例
 \,P,R の文字のいずれか。

このように [ ] の中で \ の文字を指定した場合は、 \\ と記述しないと誤検索します。
 

正  規  表  現
 [-4]
検索できる文字列の例
  - と 4 の文字のいずれか。

これを逆にして
 

× 誤った正規表現
 [4-
 

とは書かないで下さい。正確に検索できません。

(7)グループ化( )

今までのメタ文字は主に1文字を対象としていました。しかし、まとめて数文字単位で処理できると便利な場合があります。こんな時に便利なのが ( ) です。( )( ) の中をグループ化してくれます。この機能は非常に強力ですので、知っていて損はないと思います。
 
正  規  表  現
 が+ーん 
検索できる文字列の例
 ががーん   ががががーん   がががーん

この例では、+ は直前の文字の1個以上の繰り返しなので、「検索できる文字列の例」のような文字列に合致します。

ところが、
 

正  規  表  現
 (じゃ)+ーん 
検索できる文字列の例
 じゃーん   じゃじゃーん   じゃじゃじゃーん

この例では、( ) が使用されていますが、 + の直前の文字というのは、従来の1文字ではなく、( )に囲まれた部分の文字列になります。

つまり、「じゃ」の1回以上の繰り返しということになる訳です。

また、
 

正  規  表  現
 明日ぼく|わたしは帰宅します 
検索できる文字列の例
 明日ぼく     わたしは帰宅します

この例では、「明日ぼく」「わたしは家に帰ります。」の文字列のいずれかが検索されますが、
 

正  規  表  現
 明日(ぼく|わたし)は帰宅します
 
検索できる文字列の例
 明日ぼくは帰宅します   明日わたしは帰宅します

この例では、まず、( ) の中を先に処理します。つまり、「ぼく」か「わたし」のいずれかの文字列を選びます。そして、( ) の外の文字列をそのまま連結します。すると「検索できる文字列の例」のように、2通りの文字列が検索できるのです。







※ 自作の無料androidアプリです。
・猫過ぎないカレンダー
・yawyawとはアイヌ語で猫の鳴き声です。
yawyaw

苦情要望等ありましたら…

spam対策のためメールアドレスを表示するにはJavaScriptが必要です.



Privacy Policy
1998/11/27~