▲ゴト技top| 第11章 1| 2| 3| 4| 5| 6| 7| 8| 9| |
[第11章●そろそろ正規表現はいかがですか] 4… 繰り返しと文字クラス |
[2004.02.02登録] |
石田豊 |
今回のターゲットは「繰り返し」と「文字クラス」です。正規表現の中でも、もっとも多用される表現であるといえましょう。 まずは言い訳から入るのは我ながらどーかとは思いますが、このページを作成している道具の関係で、文中に半角の+を記述することができません。そこで半角の+も全角で書きます。コピペではうまく動作しないことを、あらかじめ、平伏。 そのプラスですが……。たとえば「あ+」(+は半角です)では、「あ」「ああ」「ああああ」など、「あ」が1回以上連続する文字列にヒットします。つまり「+」は「直前の文字の1回以上の繰り返し」を表します。1回以上であれば、何回でもOKです。 「1回以上」ってエライもってまわった言い方だなあ、とお感じになるかもしれません。「直前の文字の繰り返し」でええやないか、と。 でもダメなんすね。なんとなれば「*」(アスタリスク)があるからです。「*」は「直前の文字の0回以上の繰り返し」を表すのです。 なんだか、とってつけたような意味なさげな区別のようにも見えますが、これがなかなか効果的なんです。 たとえば「たあ+ざん」は「たあざん」「たあああざん」「たああああああざん」にヒットします。これを「たあ*ざん」と書くと、前例でヒットした全てがヒットする上に、「たざん」、つまり「あ」の「0回の繰り返し」にもヒットします。 私が実際にによく使うのは「石田□*豊」(□は全角スペースだと思ってください)というような表現です。人名には姓名の間に空白を入れたり入れなかったりする書き方が混在しがちです。「石田豊」で検索すると「石田 豊」って書いてある部分を見逃しちまうので、こういう書き方をします。これで「石田豊」も「石田 豊」もまとめてヒットします(ホントはもうちょっとヒネった書き方をするのですが、それは後で)。 繰り返しに表現で他に重要なのには「?」があります。これは「0回ないし1回の繰り返し」。「石田 豊」の例はこれでも大丈夫ですね。これもなかなかよく使う表現で、「プリンター*ケーブル」なんて時に重宝します。老婆心ながら付記すると、これは「プリンタケーブル」「プリンターケーブル」の両方がヒットするわけです。 ほかに「何回の繰り返し」というぐあいに繰り返し回数を指定する表現もありますが、それはあまりにマニアックに過ぎましょう。じっさい、私は使ったことないと思う。 繰り返し表現のところをお読みになって、ずいぶんなんだか「遠い」なあ、とお感じかもしれませんね。「たああざん」とかなんて例は、あまりに日常的ではない。この繰り返し表現が力を発揮するのは、これから述べる「文字クラス」との合わせ技の時が多いのです。 さきほど、「石田□*豊」という正規表現に関して、ホントはもうちょっとヒネった書き方なんて思わせぶりなことを書きました。それは実は「石田[□△]*豊」(△は半角スペースだと思ってください)って書くんです。こうすることによって姓名の間を半角スペースで空けている表現(しかも半角スペース2個以上で空けているのも含む)もヒットします。つまり全角でも半角でもOKになるってこと。 この「[]」(ブラケット)で囲まれた表現を「文字クラス」と言います。 この例のように、ブラケットの中に対象になる文字を列記することで、「その文字のどれかが」ということを表せます。われわれの最初の正規表現であった「富士フイルム」の例でも[ィイ]っていう部分がありました。小さなイでもおおきなイでもOKということ。またたとえば「い[じぢ]める」で、昨今一部で多用されている表記をも絡め取ることが可能になります。念のため言い添えると、これは「いじめる」「いぢめる」の両方にヒットします。「アレサ[△□・=]*フランクリン」と書いておけば欧米人の名前の書き方のたいていのバリエーションはカバーできそうですね。 文字クラスはこのような列記式だけではなく、範囲指定も可能です。ご存じの通り、文字(キャラクタ)にはすべてコードが付いています。つまり「文字は背番号で管理されている」わけです。その文字コード順に並べた時の先頭と最後を指定することで、その間に含まれる全ての文字を列記したのと同じと見なすわけです。 具体的には「[0-9]+」(例によって+は半角です、ホントは)。これは非常によく使う表現ですが、これで「数字1文字以上の連続」を意味します。文字コードでは「0123456789」と並んでいるからです。これで「5」でも「434」でも「32000」でも表現できます。これをちょっとひねって「[0-9,]+」とすることで、上記プラス「12,400」「37,576,893」なども取り込めます。これは範囲指定と列記を併用しているわけですね。 範囲指定式を活用するためには、ホントはコード体系をちゃんと知っている必要があります。ただし、それは理想論であって、実際には、コード体系についての詳細な理解がなくても大丈夫。というのも、よく使う「範囲指定」はそんなにバリエーションがないからです。汎用の範囲指定には次のようなものがあります。 [0-9] 半角数字(これは\dでも指定可能) [A-Za-z] 半角ローマ字 [@-Za-z_\.] 半角ローマ字と@と_(アンダースコア)とピリオド。メールアドレスを構成する文字。「\.」というふうになっているのはピリオドがメタキャラクタであるため、エスケープしている。 [ヲ-゚] 半角カタカナ。なぜかわからないけど半角カタカナのコード順は「ヲァィゥェォャュョッーアイウ」というふうに始まり、濁点半濁点で終わる。 [亜-腕] 第一水準漢字 [弌-熙] 第二水準漢字 [亜-熙] 第一・二水準漢字(以上はの漢字の範囲指定は処理系により異動があるが、K2Editor、miではこう) [0-9] 全角数字 [A-z] 全角ローマ字 [ぁ-ん] 全角ひらがな [ァ-ヶ] 全角カタカナ(全角カタカナのコードはンの後に「ヴヵヶ」が続く ま、範囲指定で使うのは、だいたいのところ、こんなものでしょう。 この範囲指定を使う実用上の例をいくつか挙げておきましょう。 「[弌-熙]」→「弌」 で、置換件数をカウントする(全てを置換すると「何カ所置換しました」という報告ダイアログが出る)ことで文中における第2水準漢字の数を数えることができます。置換する文字はなんでもいいのですが、第2水準文字にしておくと別方式のカウントも可能になります。つまり、この置換の後、もういちど 「[^弌]」→ナンニモナシ に置換して、文字数をカウント(エディタにはそのような機能は必ずといってよいほど存在する)すればいいわけです。 第2章でも述べたように(注:現時点ではまだ書いていない)、電子辞書はとっても強力な武器です。私も常用しています。よく使う辞書のひとつに電子ブック版の「小学館日本大百科全書」があります。自分の書いた文章にこの百科事典の引用をすることも少なくありません。この辞書(だけではないのですが)ではフリガナを「釜山(プサン)」という具合に、漢字表記の後ろに半角カッコにくるまれた半角カタカナで表現します。たとえば「中南海」の項は、以下のようになっています。 中南海 チュウナンカイ チョンナンハイ 中国の首都北京(ペキン)の中央部にある湖、中海、南海周辺の地区名。故宮博物院の西側に位置する。中国共産党および政府の重要機関や要人の住居が多い。中海、南海は北側の北海とともに、明(ミン)・清(シン)時代の皇宮である紫禁城(シキンジヨウ)の庭園の一部になっていた。〈船越昭生〉 引用で使う場合はフリガナのところがうっとうしいですよね。このフリガナ部分を一気に取り去るには「\([ヲ-゚]+\)」(+は半角)をナンニモナシに置換します(具体的には置換欄を空白にします)。半角カッコは正規表現で意味をもつ文字、つまりメタキャラクタですから「\」でエスケープしています。上の辞書の引用の部分をエディタにコピペして、この検索置換を実行してみてください。 中南海 チュウナンカイ チョンナンハイ 中国の首都北京の中央部にある湖、中海、南海周辺の地区名。故宮博物院の西側に位置する。中国共産党および政府の重要機関や要人の住居が多い。中海、南海は北側の北海とともに、明・清時代の皇宮である紫禁城の庭園の一部になっていた。〈船越昭生〉 ね。フリガナ部分が全部削除されました。 「\([ヲ-゚]+\)」は先にリストしたように、半角カタカナ全部ということを表します。やりたいことは結局のところ「カッコでくるまれた半角カタカナの部分を全部取る」ってことだ、とのパターン発見からこういう書き方になったわけです。 文字クラスの表現で、あとひとつ覚えておきたい表現があります。それは「否定」です。 たとえば「[^0-9]+」(+は半角)は半角数字以外の文字の連続にヒットします。文字クラスの先頭に「^」(サーカムフレックス)を付けることで、以降の文字クラス以外、ということを意味するようになります。 もちろん範囲指定だけではなく列記式でも同じことです。 「^」(サーカムフレックス)は文字クラス([]の中)にある場合は否定になりますが、それ以外では「行頭」を示すメタキャラクタです。つまり「この文字以外」ということを表現するためには、どうしても文字クラスとして表現するしかないのです。 実用的には、このあたりの事情が大きく効いてきます。これは後述。 長くなりました。今回はこれくらいにします。五十三次、箱根の山を越えたのが、今回かな。 |
この記事は
|
お読みになっての印象を5段階評価のボタンを選び「投票」ボタンをクリックしてください。 |
投票の集計 |
投票[ 10 ]人、平均面白度[ 4.6 ] ※「投票」は24時間以内に反映されます※ |
ご意見をお聞かせください |
|
←デジタル/シゴト/技術topへもどる | page top ↑ |
▲ゴト技top| 第11章 1| 2| 3| 4| 5| 6| 7| 8| 9| |
|ポット出版
|ず・ぼん全文記事|石田豊が使い倒すARENAメール術・補遺|ちんまん単語DB| |
|
|