- Published on
プログラミング初心者にもわかりやすい正規表現完全入門
- Authors
- Name
- Shou Arisaka / 有坂翔
プログラミング初心者にもわかりやすい正規表現完全入門のチュートリアルになります。
パソコンが苦手な人にこそ習得してほしい正規表現完全入門です。
正規表現は難しく奥が深いですが、基礎はそれほど難しいものではありません。 慣れるまでに時間がかかるかもしれませんが、正規表現を扱えるようになると仕事でもプライベートでも大きな効率化の道具になります。
正規表現とは
正規表現はプログラミング言語の機能のひとつで、文字の検索や置換に使われています。英語では、Regular expressionで、regexまたはregexpと省略されます。(前者のほうが優勢の印象です)
Regular expression - Wikipedia文字の検索や置換、といってもピンとこないかもしれません。実際の実用例を見てみましょう。
正規表現の基本文法
正規表現の基本文法は以下になります。ざっと目を通してみておいてください。なんとなくの理解でだいじょうぶです。使っているうちに慣れていきましょう。以下は正規表現の基本文法です。
| ... OR
() ... グループ
^ ... 行の最初
$ ... 行の最後
以下は文字クラスの一覧です。
- \s ... 空白
- \S ... 空白以外
- \w ... 文字
- \W ... 文字以外
- \d ... 数字
- \D ... 数字以外
また、特殊文字として以下があります。
- \n ... 改行
- \t ... Tab
そして、範囲指定として以下があります。
- [abc] ... aまたはbまたはc
- [^abc] ... Not a, b or c
- [a-z] ... a,b,c,...,x,y,zのうちの一文字
- [A-Z] ... A,B,C,...,X,Y,Zのうちの一文字
- [0-9] ... 0,1,2,3,...,8,9のうちの一文字
- [a-zA-Z0-9] ... a,b,c,...,x,y,z A,B,C,...,X,Y,Z 0,1,2,3,...,8,9のうちの一文字
以下は、量指定子の一覧です。
- \ ...エスケープ
- ?= ... 肯定先読み
- ?! ... 否定先読み
エスケープとは、正規表現の文法のための文字を一般の文字として解釈させることです。 例えば\d+
は21
という文字列にマッチする正規表現ですが、\d+
という文字列自体に検索を引っ掛けたい場合、\d+
といったように、エスケープをしてあげることになります。
グループは、正規表現置換をする場合、またはプログラミング言語上で利用する場合に使用する機会があります。それ以外にも、|
を使用したORを使う場合などにも使うことが多いです。
肯定先読み、否定先読みは少し難しいので後々の理解で良いでしょう。
正規表現の使用例
簡単なものから紹介していきます。- 文字列"正規表現"または"regex"を検索したい
正規表現を勉強しているあなたですが、正規表現についてのメモをファイルに書いて保存していました。しかし、正規表現についてのメモがたくさんあり、そのなかには英語でregex
と書かれたものもありました。全ての正規表現関連の文字列を検索したいあなた。さぁ、正規表現の出番です。
正規表現|regex
最も基礎的な正規表現の形です。|
は"または"の意味で、Google検索などでもよく使うOR検索と同義です。
![https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_43d040f4-aeef-4160-b6e2-0b65e7e2ac09.png](https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_43d040f4-aeef-4160-b6e2-0b65e7e2ac09.png)
- 文字列"正規表現"または"regex"または"regexp"を検索したい
正規表現|regex|regexp
3つにしてももちろんよいでしょう。
- 文字列"正規表現"または"regex"を検索したいが、"regexp"は検索したくない
もしregexpという単語がすでに存在し、その単語は正規表現とは全く関係がなく、そしてあなたはファイルのなかで"regexp"という単語を何度も使ってしまっています。そしてあなたは正規表現関連のテキストregex
または正規表現
を検索したいところですが、正規表現|regex
と検索するとregexp
も引っかかってしまいます。さて、どうしましょう。
正規表現|regex(?!p)
![https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_e5849514-6283-4824-8490-a3a8193b34d8.png](https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_e5849514-6283-4824-8490-a3a8193b34d8.png)
- URLを正規表現で検索したい
特に正規表現で多い需要が、URLやHTMLタグなどの正規表現です。こちらの正規表現はGoogleで調べればすぐにたくさんの例が出てきますが、一応紹介しておきましょう。
https?://.*.png
![https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_b75a5712-fca8-407e-be8f-c3457c7134cd.png](https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_b75a5712-fca8-407e-be8f-c3457c7134cd.png)
- AND検索をしたい
Googleではキーワードを空白で区切って検索しますが、あれはいわゆるAND検索と呼ばれます。正規表現 初心者
と検索すれば、"正規表現"と"初心者"を含んだページが表示されますね。正規表現でも、同じようなことが可能です。
^(?=.*正規表現)(?=.*初心者)
![https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_7d241bd4-fee1-4213-a8dd-00232ebd7821.png](https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_7d241bd4-fee1-4213-a8dd-00232ebd7821.png)
- マイナス検索をしたい
Googleでも-上級者
のようにしてやれば、そのキーワードを除外する、マイナス検索機能があります。
^(?=.*正規表現)(?!.*上級者)
![https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_e9df9be4-b6d9-4a54-9b91-9af92ab22405.png](https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_e9df9be4-b6d9-4a54-9b91-9af92ab22405.png)
- OR検索をしたい
これまでに学んだ正規表現をまとめてみましょう。あなたは正規表現に関するメモのうち、英語日本語関わらず、"上級者"以外のメモを検索したい。
^((?=.*正規表現)(?!.*上級者)|(?=.*regex)(?!.*high))
![https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_3333b9cc-a9a3-48e5-8eac-74ab355a48cc.gif](https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_3333b9cc-a9a3-48e5-8eac-74ab355a48cc.gif)
ほんの一部ですが、ざっと使い勝手の良い正規表現を紹介させていただきました。ぜひ手元で試してみてください。
正規表現を試してみよう
正規表現を実際に試してみる方法としておすすめなのでは、実際にテキストエディタ上で実用してみることです。atomなどの多くのプログラミング用テキストエディタでは正規表現機能が搭載されています。 これらのテキストエディタ上で好みの文書データを、実際に正規表現検索、正規表現置換してみるのが、一番理解がしやすいと僕は思います。といっても、手っ取り早いテスト方法もあります。正規表現をテストするためのウェブサイトもいくつかあり、検索するとたくさんヒットします。 以下のサイトもそのひとつです。是非活用してみてください。
RegExr: Learn, Build, & Test RegEx![https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_8c6d0293-a409-4208-803a-3249fa6400d2.png](https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_8c6d0293-a409-4208-803a-3249fa6400d2.png)
正規表現はひとつだけじゃない
正規表現と一言で言っても、正規表現には種類がいくつかありまして、バージョンなどもあります。それらを曖昧なままに正規表現を使い続けると、いずれ"あれ?あってるはずなのに正規表現が機能しない…"ということになりかねません。 簡単でいいので、ここらへんを把握しておきましょう。まず正規表現というと、正規表現は正規表現でしょ、と思われるかもしれませんが、いくつかの種類があります。
まず代表的なものが、PCRE(perl互換正規表現)です。
Perl Compatible Regular Expressions - WikipediaこれはPHPやPerlといったプログラミング言語で採用されています。
次にPOSIX正規表現があり、こちらはPCREよりマイナーで、少し書き方が違うところがあります。データベース言語のMySQLなどがこれにあたります。
ライク検索、あいまい検索と呼ばれるものも一種の正規表現です。
また、プログラミングに精通している人であれば触ったことがあるであろうコマンドラインのワイルドカード検索。ls *.txt
みたいに使ったりしますね。これも正規表現の亜種みたいなものです。 正確にはこれらの機能はGlobbing、またはBash Extended Globbingと命名されています。
あまり知られていませんが、Bash Extended Globbingでは以下のような正規表現により近い記述もできます。一般の正規表現とは全く文法が異なる、面白い例です。
*.+(flac|wav|wave)
ある環境や言語の正規表現が、他の正規表現と同じように使えるとは限らない、ということを覚えておきましょう。 とはいっても、ほとんどの正規表現は互換性がありますので、上位互換(Ruby,PHP,perlなど)か下位互換(JavaScript,MySQLなど)か、という話になります。プログラミングがわからない方も、とりあえず正規表現を利用できるソフトウェアがどのプログラミング言語で作られているかを見てみると良いでしょう。
chromeブラウザで正規表現検索をしてみよう
さて、ブラウジングにchromeを使っている人は多いかと思いますが、chromeなどのウェブブラウザではJavaScriptというプログラミング言語がバックグラウンドで動いています。 chrome拡張機能もJavaScriptで書かれており、正規表現機能を提供する拡張機能もいくつかあります。chromeで正規表現検索する拡張機能![https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_480ab442-653d-4cea-9ec3-adc3ae51d2f8.png](https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_480ab442-653d-4cea-9ec3-adc3ae51d2f8.png)
JavaScriptは前述の通り、PCREではなく、より下位のものであるため、機能は少しだけ制限されます。(具体的には、否定後読み(Negative lookbehind)などの機能が使えません) とはいっても、atomなどのテキストエディタもJavascriptから作られているため、同じ正規表現です。
正規表現を取り入れているソフトウェア
実際に正規表現検索や正規表現置換を取り入れている便利なソフトウェアを紹介しましょう。everything
![https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_c3163d68-94cf-42b2-b070-0b19535c1b67.png](https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_c3163d68-94cf-42b2-b070-0b19535c1b67.png)
everythingはWindowsで使用できる、ファイル検索ソフトウェアです。テキストデータではなく、ファイル名を検索するタイプのものです。
以下記事にてeverythingの具体的な正規表現を紹介しています。
everythingでWindows 10のファイル検索を超効率化しようatom
![https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_77c35549-2a74-4a21-bc99-c5c6fa972ec5.png](https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_77c35549-2a74-4a21-bc99-c5c6fa972ec5.png)
atomは近年人気のテキストエディタです。
Atom正規表現検索を使う機会として一番多いのは、やはりテキストエディタ上ではないでしょうか。 正規表現検索のみならず、正規表現置換も使えます。
画像URLをMarkdownに変換する正規表現置換の例
(https:.*yuis\.xsrv\.jp.*(\.png|\.jpg))
![$1]($1)
![https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_b0f6e08f-6263-4c75-ac23-61829eda20d2.gif](https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_b0f6e08f-6263-4c75-ac23-61829eda20d2.gif)
ag
![https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_c2fdfffa-e79c-46d1-807e-191996349b17.png](https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_c2fdfffa-e79c-46d1-807e-191996349b17.png)
agはテキストファイルやコマンドの出力を正規表現検索するコマンドラインユーティリティです。
以下記事にてagの具体的な正規表現を紹介しています。
さらに深い正規表現を学べるサイト
基本的な正規表現は、前項で記述したとおりですが、まだまだ正規表現は深いのです。英語のサイトですが、こちらのサイトは正規表現をかなり深掘りして解説してくれています。
Regex Cheat Sheet他には、regex repl - Google Search
正規表現は奥が深い
僕もプログラミングをはじめた頃から正規表現に触れていて、数年正規表現に触れていますが、ようやく基本的なところは理解できた、といったところです。正規表現はかなり深い、勉強が必要な一カテゴリですが、その価値が十分にあるものでもあると思います。少なくとも、正規表現の概念がなくなってしまったら、僕を含めた大勢の人は鬱になってしまうことでしょう。笑 それほど正規表現は強力なツールです。ぜひ、簡単なところからでも学びはじめてみてください。