正規表現でカタカナを検索

こんにちは、スクリプト担当のFです。

社内で正規表現について勉強会を開いた際、例文中のカタカナを検索するという演習問題を作成してみました。

● カタカナを検索する正規表現式(初級編)

以下の文章から、カタカナを検索する正規表現式を作成してください。ただし、「・(ナカグロ)」「ー(音引き)」も含むものとします。また、カタカナの定義は「[ァ-ヴ]」とします。


※対象アプリケーションはInDesign

解答:[ァ-ヴ][ァ-ヴー・]*

この演習問題は『「・(ナカグロ)」「ー(音引き)」も含むものとします。』という部分がミソです。最初の [ァ-ヴ] でカタカナを認識し、このあと「・」「ー」を含むカタカナが続くかどうかという考え方です。

001

別解として [ァ-ヴー・]{2,} も考えられます。汎用性の無い書き方ですが、この演習問題では正解です。大事なのは正規表現のロジックを考えられるかどうかです。

● カタカナの範囲指定

このカタカナの定義 [ァ-ヴ] のように [   ] で文字と文字をハイフンでつないだ書き方は文字コードで範囲指定することをあらわします。つまり、この場合対象アプリケーションはInDesign(内部の文字コードがUnicode)なので、Unicodeコードポイント30A1から30F4が [ァ-ヴ] のマッチする対象である、ということになります。

002

Unicode文字コード表からコードポイント30A1から30F4

もし、「ヵ」や「ヶ」をカタカナとして正規表現で検索する必要があるとする場合は [ァ-ヵ] または [ァ-ヶ] という書き方になります。

ちなみに、数字は [0-9] 、アルファベット大文字は [A-Z] 、アルファベット小文字は [a-z] という書き方です。

003

数字、アルファベット大文字・小文字

大文字小文字すべてを含むアルファベットは [a-Z] とはなりません。小文字の a は文字コード表では大文字の Z より後ろにあるため、後戻りはできないからです。 [A-Za-z] という書き方が一般的です。

● カタカナを検索する正規表現式(中級編)

以下の文章から、カタカナを検索する正規表現式を作成してください。ただし、「・(ナカグロ)」「ー(音引き)」も含むものとします。また、カタカナの定義は「[ァ-ヴ]」とします。

※対象アプリケーションはInDesign

解答:[ァ-ヴー]+(・[ァ-ヴー]+)*

先ほどとまったく同じ問題文ですが、例文が違います。ジョンジーが三味線を弾いたという事実はたぶんありませんが、あくまで例文ということで(笑)。文末もクレしんみたいですが気にしないでください。
この演習問題はグルーピングの応用です。最初の [ァ-ヴー]+ で「ー」を含んだカタカナの連続にマッチし、その後に「・」で始まるカタカナが続くかどうかという考え方です。

● カタカナを検索する正規表現式(上級編)

先ほどの解答だと先頭に「ー」があるカタカナにもマッチしてしまいます。理論上はあり得ませんが回避するには

解答:[ァ-ヴ][ァ-ヴー]*(・[ァ-ヴ][ァ-ヴー]*)*

となります。

● カタカナを検索する正規表現式(番外編)

さらに、例文にある人名が「ジャン=ポール・ゴルチエ」や「ジャン=リュック・ゴダール」の場合はどうでしょう? 中黒に加え「=」も考慮するなら

解答:[ァ-ヴ][ァ-ヴー]*([・=][ァ-ヴ][ァ-ヴー]*)*

となります。

● InDesignCS3のバグ

さて、InDesignでの正規表現という前提で記事を書いていますが、CS3のみとんでもないバグがあったりします。なんとカタカナの検索ができません!

10

カタカナを検索したはずが!

20

ひらがなにマッチするではないか!!

30

ひらがなはマッチしている!?

Adobeからの正式なアナウンスは見当たらなかったのですがCS3から実装された機能ですので欧米人にはひらがなカタカナの区別ができなかったのもまあ無理もないかなと思われます。とはいえ回避方法はあります。Unicodeコードポイントで範囲指定( [x{30A1}-x{30F4}] )すればいいのですが、どうも腑に落ちませんな。

● \p{Katakana}

InDesign以外で正規表現を使う場合だと、OnigmoやOniguruma(鬼車)という検索エンジンを搭載したエディタでは \p{Katakana} という書き方でカタカナを検索することができます。検索範囲は [ァ-ヴ] より広範囲のようですがこの話は奥が深すぎるのでまたいずれ。