このブログのはてなブックマーク数 このエントリーをはてなブックマークに追加

知らなきゃ絶対損するPCマル秘ワザ

知らなくて損したPC情報とかを分かりやすくメモする個人ブログ。
『月,水,金』の週3回更新!(予定)

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

このエントリーをはてなブックマークに追加
イメージ


こんにちは、さち です。

「正規表現」って知っていますか?
簡単に言うと、文などから特定の文字を探し出す仕組みです。
(厳密には違うが、このような使われ方が多い)

正規表現は、主にプログラミングで使われますが
テキストエディタの「検索」「置換」、
ツイッタークライアントの「ミュートワード」、
2ちゃんねるブラウザの「NGワード」 などで使える場合もあり
プログラミングをしない人でも知っていると役立ちます。

ただ、「正規表現」には記述のルールが色々あって
イマイチちゃんと把握できていない…。

ということで、今回は
「正規表現」の記述方法についてまとめていきます。
ものすごく備忘録です。




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

「正規表現」には「メタ文字」と呼ばれる特殊な文字があり
この「メタ文字」を使うことで複雑な文字列を表現します。

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

分かりやすい簡単な「メタ文字」を使うだけでも
そこそこ複雑な文字列を表現できるようになります。

もちろん、「メタ文字」を今すぐ覚える必要はありません。
使っているうちに自然と覚えられるので気楽にいきましょう。




1. 「文字種」を指定するメタ文字

表

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

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

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

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

ただし、上のような表記であらわせるのは「1文字」だけ。
文字数の指定には、次に紹介する繰り返しを意味するメタ文字が別途必要です。




2. 「繰り返し」を指定するメタ文字

表

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

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

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

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




3. 「位置」を指定するメタ文字

表

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

例えば、先頭が「http」からはじまるという正規表現は
^http」のように記述します。

基本は、先頭,末尾 を意味する
^」「$」さえ知っていれば大体のことは間に合います。
ただし、「^」は [ ] 内だと否定の意味になるので注意。
例えば、^[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」ような「選択」をあらわすメタ文字です。

例えば、正規表現で「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」を知っていれば大体は何とかなります。
(アルファベットを大文字にすると「否定(Aでない)」の意味になる)

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




7. 「先読み」「後読み」を意味する記述

表

特定の文字列を含む/含まないようにする時に使う記述方法。

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




8. キャプチャ

表

カッコで囲むとその部分がキャプチャされ、使い回すことができます。

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

また、テキストエディターの「置換」では
「検索」を、「([a-z]+)_\1
「置換」を、「$1×2」とすると
「ma_ma」は「ma×2」、「waku_waku」は「waku×2」に置換できます。




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

例えば、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+円/;

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




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

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



このエントリーをはてなブックマークに追加




ブログ移転に伴い、コメント受付は終了しました。



記事別の週間アクセス数ランキングです。こちらの記事もぜひ読んでみて下さい。

2008-2019 知らなきゃ絶対損するPCマル秘ワザ  無断転載禁止

ブログパーツ