正規表現で文字を表すルールは4つです。
メタ文字以外の文字は文字そのものを表します。正規表現「abc」は「abc」にマッチします。(当たり前ですがルールとしては重要なので…)
「.」はどんな文字にもヒットします。ヒットするのは1文字です。試しに検索文字を「.」にして正規表現で検索してみましょう。すべての文字に順番にヒットしていくはずです。
すべての文字にマッチする「.」はこんな風に使います。
正規表現 「財政.字」
は
財政赤字
財政黒字
などにヒットします。
すでに出てきた「+」という繰り返し記号を使えば
正規表現 「国連.+会議」
は
国連貿易開発会議
国連人間環境会議
国連軍縮会議
国連開発資金会議
国連女性会議
などにヒットします。
注意が必要なのは「.」は「改行文字」にはヒットしないことです。「改行文字」とは行の終わりに入っている改行コードのことです。たとえば
<title>.+</title>
といった感じでタグに囲まれた範囲を検索したい場合
<title>↓
見出し語↓
</title>↓
のように複数の行にまたがった場合は検索できません(↓は改行を表す)。*3
「.」はすべての文字にマッチしますが、特定の複数文字にマッチさせたい場合もあります。たとえば曜日の表記は「月火水木金土日」のうちどれかです。こういった文字集合を「文字クラス」といいます。例をあげましょう。
<数字>月<数字>日(<曜日を表す文字>)
というパターンの括弧内には曜日が入りますが、この曜日を表す文字は7つですね。これを正規表現では
[月火水木金土日]
と表します。[...]という表現はブラケット内の各文字のどれか1文字を表します。数字のほうはすでに紹介した[0-9]で表されますから、上のパターンを正規表現で表すと以下のようになりますね。
[0-9]+月[0-9]+日([月火水木金土日])
上の正規表現を試す時は丸カッコは全角のものを使用してください。半角だと検索ができません。理由は後々説明します。
よくアルファベットにマッチしたいとか、カタカナにマッチしたいといった場合があります。アルファベットにマッチさせる文字クラスは
[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]
と書いても良いのですがもっと簡単に以下のように書けます。
[a-zA-Z]
ブラケット中で「文字-文字」と指定すると、ある文字コードからある文字コードまでの文字すべてを指定することができます。幸い「a」から「z」、「A」から「Z」は文字コード表で順番に並んでいますから、上のような簡略な記述が可能です。
すでに0から9までの文字を表す[0-9]を紹介しました。これも文字コードの範囲指定です。「0」から「9」や全角数字「0」から「9」は文字コード表で順番に並んでいますので簡単に表記できます。でも同じ意味でも漢数字「零」から「九」は文字コードはバラバラです。ですから漢数字の文字クラスを
[零-九]
と表現することはできません。漢数字の文字クラスは
[零一二三四五六七八九]
とか
[〇一二三四五六七八九]
といった表現になります。
「アルファベットではない文字を探したい」など「〜でない文字集合」を指定出来ると便利です。その文字集合以外の文字(文字クラスの否定)という指定ができるようになっています。
文字クラスの否定は文字クラスの最初に「^」をつけることで表現します。「アルファベットではない文字」は次のように表現できます。
[^a-zA-Z]
これを否定表現を利用しないで書くと
[ -@[-`{-゚ -熙]
という複雑な指定になりますから否定表現はとても便利ですね。
文字クラスにメタ文字を含める時は注意が必要です。原則的には‘[’と‘]’の間ではメタ文字は通常の文字と同じものと解釈されます。たとえば下のようにメタ文字をブラケットで括った表現は、「$*+|()?」という文字そのもののうちのひとつにマッチします。
[$*+|()?]
ただし以下の4つについては‘[’と‘]’の間でメタ文字扱いになります。これらの文字そのものを表すには「\」を使ってエスケープするなど特別な記述が必要です。
- | 先頭か最後に置く もしくは \- とする |
] | \]とする |
\ | \\とする |
^ | 先頭以外へ置く もしくは \^ とする |
なお「[」も気になりますが、これはメタ文字扱いになりませんからどこへ置いても問題ありません。下の例は文字クラス内のメタ文字自身を検索する正規表現です。
[-^\]\\]
「-」は先頭において特別な意味をなくしてあります。「^」は先頭以外においてあるので否定の意味はなくなります。「]」と「\」は「\]」「\\」としてエスケープしてありますね。
【ポイント】
ブラッケットの表すものはたったの1文字です。「[月火水木金土日]」は表現が長いからといって「月火」とか「月水金」とかにはなりません。つい勘違いしやすいのでご注意。
秀丸エディタの正規表現で扱える特別な文字について説明します。
いろいろな特殊コードが扱えるようになっていますが通常必要なものは以下のふたつでしょう。(丸括弧内の数字は文字コード 10進です)
\n | ニューライン(10) |
\t | 水平タブコード(09) |
「\n」は改行文字にマッチします。空行を見つける場合は以下の正規表現が役立ちます。
\n\n
つまり改行と改行の間に何もない状態ですね。
「\t」はタブコードです。HTMLやXMLを検索する場合は大活躍します。
英語をよく扱われる方は以下も知っておけば便利かもしれません。
\< | 英単語の始まり |
\> | 英単語の終わり |
\w | 英単語 |
英単語とは何かが問題になりますが、aからz、AからZとアンダーバー「_」の連続したものです(*4)。ハイフン(マイナス符号)は含まれません。以下に例をあげます。
aaa_zzAA | これは全体がひとつの英単語 |
aaa-zzAA | aaa と zzAA のふたつが英単語 |
aaa-9zzAA | 上と同じ。「-」と「9」は英単語ではない |
aaa_9zzAA | aaa_ と zzAAが英単語「9」は英単語ではない |
あいうabcあいう | abc が英単語 |
英単語の始まり・終わりはこの英単語の前後の位置を示します。これは位置指定に分類したほうが分かりが良いと思われます。つまり何か実態のある文字を表したものではありません。
以下のような検索をするとingで終わる英単語を探せます。
ing\>
「cooking」「cooking.」などにはマッチしますが、「single」や「ingot」にはマッチしません。英単語の切れ目にはいろいろな文字が来るのでこれを覚えておくと便利です。
そのほか以下のものが特殊文字として使用できます。普通は滅多に利用しないでしょうから解説は簡単に済ませます。
\ooo | 文字コード8進数(oは1〜3桁) 例)\40 半角空白 |
\xhh | 文字コード16進数(hは1〜2桁) 例)\x20 半角空白 |
\a | ベル(07) |
\b | バックスペース(08) |
\r | キャリッジリターン(13) |
\v | 垂直タブコード(11) |
\e | エスケープコード(27) |
\z | エンドオブファイルコード(EOF:26 ただし文末以外) |