スポンサーリンク

「正規表現」の勉強のために「メタ文字」をまとめてみた

この記事は約7分で読めます。

イメージ

こんにちは、さち です。

突然ですが、「正規表現」って知っていますか? 簡単に言うと、文章などから特定の文字を探し出す仕組みです。

正規表現は、プログラミングで使うイメージが強いですが、他にも……

  • テキストエディタの「検索」「置換」
  • ツイッタークライアントのなどの「ミュート」
  • 5ちゃんねるブラウザの「NGワード」

などで使えることがあるので、プログラミングをしない人にも役立ちます。

ただ、『書き方が難しそう』『ワイルドカードと何が違うの?』そんな不安がある人もいると思います。

そこで、今回は「正規表現」の記述方法についてまとめていきます。

スポンサーリンク

「メタ文字」を使いこなそう

「正規表現」には「メタ文字」と呼ばれる特殊な文字があります。この「メタ文字」を使って、複数の文字列をまとめて表現できます。

正規表現を使いこなすには、この「メタ文字」の使いこなしが必須!

「メタ文字」をすべて覚える必要はありません。簡単なものだけでも、そこそこ複雑な文字列を表現できます。

よく使う「メタ文字」は自然と覚えられます。気楽にいきましょう。

メタ文字の種類

メタ文字にはいろいろなものがあり、意味するものが異なります。種類ごとに勉強していきましょう。

1. 文字の種類

表

どの「文字の種類」が使われているかを指定するメタ文字です。

例えば、「.(ドット)」は任意の一文字をあらわします。「.(ドット)」はよく使うので、これだけは絶対に覚えておきましょう。

ちなみに、「-(ハイフン)」を使った表記は、「文字コードが ○○○ から △△△ までの文字」という意味。

「ひらがな」「カタカナ」のスタートが拗音(小さい文字)である理由は、その文字の種類の文字コードが拗音からはじまるからです。(「半角カタカナ」も同様)

ただし、このようなメタ文字であらわせるのは「1文字」だけ。文字数の指定には、次に紹介する繰り返しを意味するメタ文字を使います。

2. 繰り返し

表

文字の「繰り返し」を指定するメタ文字です。

例えば、数字が0回以上の繰り返すという正規表現は、「[0-9]*」のように記述します。

*」「+」による繰り返しはよく使います。それぞれ「0回以上」「1回以上」という違いがあります。上手く使い分けましょう。

?」は意外と便利です。例えば「http」と「https」両方を対象にしたい場合、「s」は有っても無くてもよいものと言えるので、「https?」のように記述します。

○回以上繰り返す記述で、「,(コンマ)」の前後にスペースを入れると正常に動きません。コーディングのクセで入力しないように気をつけましょう。

3. 位置(先頭・末尾など)

表

文字列がどの「位置」にあるかを指定するメタ文字です。

基本は、先頭,末尾 を意味する、「^」「$」さえ知っていれば大体のことは間に合います。

例えば、先頭が「http」からはじまる場合は「^http」、末尾が「html」でおわる場合は「html$」のように記述します。

ただし、「^」は [ ] 内だと否定の意味になるので注意。例えば、^[0-9] は数字からはじまる文字列という意味ですが、[^0-9] は数字以外の任意の1文字という意味です。

ちなみに、「\b」の「単語境界」とは単語の先頭や末尾のこと。例えば、「e\b」とした場合「cute and clever elichika」で該当するのは、「cute」の末尾の「e(赤字部分)」だけで、他の「e」は該当しません。「\be」とした場合は「cute and clever elichika」で該当するのは、「elichika」の先頭の「e(赤字部分)」だけです。

4. 選択(AまたはB)

表

「AまたはB」ような「選択」をあらわすメタ文字です。

例えば、正規表現で「No(zomi|ntan)」と書いた場合、「No」の続きは「zomi」と「ntan」から選択することになり、「Nozomi」と「Nontan」という2つの文字列をあらわします。

普通なら2つの文字列を別々に書く必要があるものを、一つの正規表現であらわせるわけです。

ちなみに、「選択」は複数使用できるので、「No(zomi|ntan|nnon)」のようにさらに追加できます。

5. エスケープ文字

表

.(ドット)」をはじめとした「メタ文字」で特殊な意味を持つ文字は、そのままでは「普通の文字」として使うことができません。

例えば、正規表現で「www.lovelive.jp」という文字列を作るには、「www\.lovelive\.jp」のように
.(ドット)」の前に「\」を書きます。

このような方法を「エスケープ」と言います。

また、「\」自体もメタ文字(=特殊な意味を持つ文字)なので、普通の文字として「\」を使うには「\\」と書く必要があります。

ちなみに、「\」はフォントによって表示が異なる文字です。海外のフォントでは半角の「(バックスラッシュ)」、日本語のフォントでは半角の「(円記号)」で表示されます。

6. その他のメタ文字

表

特殊な意味を持つメタ文字です。

「改行」「タブ」「空白」を意味する「\n」「\t」「\s」を知っていれば大体は何とかなります。(アルファベットを大文字にすると「否定(~以外)」の意味になる)

\d」「\l」「\u」「\w」などは記述を省力化できて便利ですが、文字種の指定でも間に合うので無理に覚えなくてもいいです。

7. 先読み・後読み

表

特定の文字列を含む/含まないようにする時に使う記述方法。少し複雑なので、無理に使わなくても大丈夫です。

先読み,後読みで行われるのは条件を満たす「位置」を探すことです。「^」「$」「\b」「\B」などの仲間だと思って下さい。

例えば、否定先読みを使って「Yo(?!shiko)」とした場合、「Yoshiko」は一致しませんが、「Yohane」は一致します。ただし、否定先読みが行うのは位置を探すことだけなので、抽出されるのは「Yo」だけです。

8. キャプチャ

表

カッコで囲むとその部分がキャプチャされ、使い回すことができます。これも最初は無理に使わなくても大丈夫です。

例えば、「([a-z]+)_\1」とした場合、「ma_ma」「waku_waku」など同じ文字列が連続したものを探せます。

また、「置換」ではキャプチャした内容を出力にも利用できます。例えば、「検索」を「([a-z]+)_\1」、「置換」を「$1×2」とすると、「ma_ma」は「ma×2」、「waku_waku」は「waku×2」に置換できます。(「$1」でなく「\1」と記述する場合もある)

「\」が付くメタ文字が機能しない場合

例えば、JavaScript の「文字列リテラル」の部分、つまり「"」や「'」で囲まれた文字列を書く部分では、正規表現の「\n」「\d」「\\」などが正常に機能しません。

そのような場合、「\」を「\\」に置き換えましょう。「\n」→「\\n」,「\d」→「\\d」,「\\」→「\\\\」といった感じです。これで正常に機能するはずです。

var re = new RegExp("\d+円");

var re = new RegExp("\\d+円");

なぜ置き換えないと動かないのか……?

例えば、JavaScript で「alert("こんにちは\nさようなら")」と書いたとき、文字の「\n」は表示されず「改行」になりますよね。JavaScript でも「\」はメタ文字(=特殊な意味を持つ文字)なんです。

これと同じことが「\d」にも起こります。しかし、JavaScript には「\d」という表記は存在しません。結果、「\」が削除されて単なる「d」になり、これが正規表現に送られます。そのため、正規表現が正常に動かないわけです。(同様に、「\\」は「\」に変換されてから正規表現に送られる)

ちなみに、文字列リテラルを使わない方法で正規表現を書けば、通常どおりに記述しても大丈夫です。(JavaScript では「/」で囲まれた部分は正規表現リテラルとなる)

var re = new RegExp("\\d+円");

var re = /\d+円/;

文字列リテラルに正規表現を記述する場合は、そのプログラミング言語のメタ文字に注意しましょう。

正規表現については私もまだまだ勉強中です。誤りなどがありましたら教えて頂けるとありがたいです。

今回紹介したメタ文字については、比較的簡単で使いやすいものに絞っているので、物足りない方は別途検索して勉強してみて下さい。

コメント

タイトルとURLをコピーしました