質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1048閲覧

【C#】文字列に補助漢字(JIS X 0212-1990)が含まれているかチェックする方法

yuuuuya

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

1グッド

1クリップ

投稿2017/11/08 00:48

掲題の件、
文字列に補助漢字(JIS X 0212-1990)が含まれているかをチェックする方法はございますか?

ご教示お願いいたします。

bochan2👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/11/08 01:01

何を作っているか(Windows Forms? WPF? その他?)と自分の開発環境(OS, .NET, Visual Studio のバージョンなど)ぐらいは書けませんか?
yuuuuya

2017/11/08 01:24

失礼しました。Windowsフォーム、windows7、.NET 4.7、VisualStudio2017です。
guest

回答1

0

ベストアンサー

文字列に補助漢字(JIS X 0212-1990)が含まれているかをチェックする

正規表現を使ってチェックする方法があります。

文字クラス(角かっこ "[ ]" で囲むことで定義される正規表現内のミニ言語)で対象とする JIS X 0212 の文字を定義したパターンを作り、それとチェック対象の文字列がマッチするか調べることで可能だと思います。

例えば以下のようにしてチェックできます。(かなり基本的かつ愚直な例です。もっと簡単かつスマートな方法があるかもしれません)

C# では文字列の内部表現が UTF-16 になっています。

一方 JIS X 0212 の文字は全て Unicode に含まれているそうで、各文字に対応する Unicode は以下のようになっているそうです(注:これが JIS X 0212 全ての文字かは調べてません)。

JIS X 0212コード表(1)02-31区
http://www.asahi-net.or.jp/~ax2s-kmtn/ref/jisx0212/jisx0212-1.html

なので、例えば(あくまで例えばです)、上の記事の表で、2 句 16 点にある文字と、7 句 32 点にある文字が含まれるかどうかをチェックするには、以下のようなパターン (pattern) を作って、それとチェック対象の文字列 (text1, text2, text3) がマッチするか否かを調べるということになります。(下の例では、text2 と text3 の 'あ' と 'い' の間に JIS X 0212 の文字が含まれています)

string pattern = @"[\u02C7\u00B8\u02D9\u02DD\u00AF\u02DB\u02DA\u007E\u0384\u0385\u0402-\u040F]"; string text1 = "0123 abc DEF あいうえおかきくけこ"; string text2 = "0123 abc DEF あ˚いうえおかきくけこ"; string text3 = "0123 abc DEF あЄいうえおかきくけこ"; Console.WriteLine(Regex.IsMatch(text1, pattern).ToString()); Console.WriteLine(Regex.IsMatch(text2, pattern).ToString()); Console.WriteLine(Regex.IsMatch(text3, pattern).ToString()); // 結果は: // False // True // True

問題はパターンで、7 句 32 点にある文字のように Unicode が連続していれば \u0402-\u040F とできますが、2 句 16 点にある文字のように連続していない場合は一文字ずつ \u02C7\u00B8\u02D9\u02DD\u00AF\u02DB\u02DA\u007E\u0384\u0385 というように書くことになります。

JIS X 0212 の文字全てということになるとそのあたりが上記の方法では愚直すぎで、もっと簡単かつスマートな方法があるかもしれません。(・・・が、自分は思いつきません。他の方の回答を期待してください)

ところで、正規表現をご存知でしょうか? ご存じない、もしくは知識が曖昧ということでしたら以下の記事を読むことをお勧めします。(記事のタイトルが「ASP.NET の・・・」となってますが、「ASP.NET での検証」というセクションを除けば .NET アプリ全てに共通で、自分が知る限りですがこの記事が一番分かりやすかったです)

ASP.NET の正規表現 文字クラス
https://msdn.microsoft.com/ja-jp/library/ms972966.aspx

投稿2017/11/08 04:07

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuuuuya

2017/11/09 08:46

お世話になっております。 詳細な回答ありがとうございます。 漢字部分だけチェックできれば問題ないので範囲指定(4E02-9FA5)でできそうです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問