.NET TIPS

文字列のひらがな/カタカナをチェックするには?

デジタルアドバンテージ
2003/08/22

 .NET Frameworkのクラス・ライブラリには、文字列(もしくは文字)がひらがなか、あるいはカタカナかをチェックするための特定のメソッドは用意されていない。そのため、それを調べるには各文字の文字コードをチェックする必要がある。ただし、.NET Frameworkの正規表現クラスでは、ひらがなやカタカナの文字コードの範囲(ブロック)を定義している「名前付き文字クラス」と呼ばれるものがサポートされている。これを利用すれば文字列のひらがな/カタカナを簡単に調べることができる。

ひらがな/カタカナを表す正規表現

 Unicodeの規格制定団体であるUTC(Unicode Technical Committee)は、http://www.unicode.org/Public/UNIDATA/Blocks.txtにおいてUnicode文字のブロックの範囲を定義している。このドキュメントには、日本語の文字に関するブロックとして次のようなものがある。

文字の種類 ブロックの範囲(16進表記) ブロック名
ひらがな 3040 〜 309F Hiragana
カタカナ 30A0 〜 30FF Katakana
漢字 4E00 〜 9FFF CJK Unified Ideographs

 ここで、次に示すように表中のブロック名の先頭に“Is”を付け文字列を中カッコでくくり、“\p”を付けたものが正規表現における「名前付き文字クラス」となる(文字列が漢字だけからなるかどうかのチェックは実際の業務システムではあまりないと思われるが、参考までに漢字についても併記しておく)。

\p{IsHiragana}
\p{IsKatakana}
\p{IsCJKUnifiedIdeographs}

 これらの正規表現はブロック名が示す範囲に含まれる文字と一致する。よって、例えばひらがなだけからなる文字列と一致する正規表現は次のようになる。

^\p{IsHiragana}*$

 ここで、“^”は行頭、“$”は行末にマッチし、“*”は直前の要素の0個以上の繰り返しにマッチする。正規表現とそのプログラミングについては「スマートな文字列処理のための正規表現入門」で解説されているのでそちらを参考にしていただきたい。

Regex.IsMatchメソッドによる文字列のマッチ

 さて、ある文字列が渡されたとき、それが特定の正規表現にマッチするかどうかを調べるには、Regexクラス(System.Text.RegularExpressions名前空間)のIsMatchメソッドが利用できる。このstaticなメソッドを使用すると、文字列strがひらがなかどうかは次のようなコードで記述することができる。

bool isHiragana = Regex.IsMatch(str, @"^\p{IsHiragana}*$");

 IsMatchメソッドは文字列と正規表現がマッチした場合にはtrue、さもなければfalseを返す。

 次のサンプル・プログラムは、ひらがなとカタカナのチェックを行っているコード例である。

// iskana.cs

using System;
using System.Text.RegularExpressions;

public class StringChecker {

  static bool IsHiragana(string str) {
    return Regex.IsMatch(str, @"^\p{IsHiragana}*$");
  }

  static bool IsKatakana(string str) {
    return Regex.IsMatch(str, @"^\p{IsKatakana}*$");
  }

  static void Main() {

    string hiragana = "こんにちは";
    string katakana = "コンニチハ";
    string kanji    = "今日は";

    Console.WriteLine(IsHiragana(hiragana)); // 出力:True
    Console.WriteLine(IsHiragana(katakana)); // 出力:False
    Console.WriteLine(IsHiragana(kanji));    // 出力:False

    Console.WriteLine(IsKatakana(hiragana)); // 出力:False
    Console.WriteLine(IsKatakana(katakana)); // 出力:True
    Console.WriteLine(IsKatakana(kanji));    // 出力:False
  }
}

// コンパイル方法:csc iskana.cs

ひらがなとカタカナのチェックを行うC#のサンプル・プログラム(iskana.cs)

ブロックに含まれる文字

 “\p{IsHiragana}”などは、単に文字コードの範囲指定を文字列に置き換えているだけなので、

[\u3040-\u309F]

といった文字コードによる正規表現でも同じ内容を示すことができる(「\u+16進数」はUnicode文字と一致する)。

 Unicode文字を示す文字コードは、Windowsに標準で付属する「文字コード表」により確認することができる。このアプリケーションを起動し、[フォント]ドロップダウン・リストボックスで「MSゴシック」などを選択してから文字をマウスで選択すれば、その文字コードが画面一番下のステータス・バー部分に表示される。

Windowsに標準で付属する「文字コード表」アプリケーション
このアプリケーションを使用すれば、Unicode文字の文字コードを知ることができる。
  日本語のフォントである「MSゴシック」などを選択する。
  “\p{IsHiragana}”が表す文字の範囲。

 これによれば、“ぁ”(\u3041)から“ゞ”(\u309E)までが、“\p{IsHiragana}”によりカバーされる文字なので、

[ぁ-ゞ]

と記述しても、ほぼ同等な正規表現となる。各文字ブロックの範囲に含まれる文字を正確に知りたい場合には、UTCにあるCode Chartsを参照していただきたい。End of Article

カテゴリ:クラス・ライブラリ 処理対象:文字列
使用ライブラリ:Regexクラス(System.Text.RegularExpressions名前空間)
 
この記事と関連性の高い別の.NET TIPS
正規表現を使って文字列がパターンに一致するか調べるには?[C#/VB]
文字列を1文字ずつ解析するには?(サロゲート文字対応)
正規表現を使って文字列から部分文字列を取り除くには?
文字列から特定の文字列を取り除くには?
正規表現を使ってパターンに一致する全ての文字列を抽出するには?[C#/VB]
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間