電子出版小技集 h003

文字を表すルール

超簡単「正規表現」入門 その2

 正規表現で文字を表すルールは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 ただし文末以外)

・以下の項目は次号解説します。
 
*3  上の例の場合「<title>.+\n?.*\n?.*</title>」で検索は可能だが、秀丸エディタでは改行をまたがった正規表現検索は制限がある。秀丸エディタのヘルプ「\nを使った複数行検索の際の制限について」を参照のこと。
 また秀丸エディタでは正規表現が非常に複雑になると「もっと簡単にしてください」というエラーメッセージが表示される。そんな場合は処理を工夫しよう。
 この例では「<title>行の後の改行を削除→</title>行の前の改行を削除」という手順を踏めば<title>〜</title>は1行に納まるので処理が簡単になる。
*4  Perlなどの正規表現では英単語の定義は「英字とアンダーバーと数字の連続」。定義が異なっているので注意。
戻る

BACKNewsletterのTopに戻る
Homeトップページに戻る