こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

半角カナの文字列操作について

通常10桁の半角カナの文字列があった場合下記のように

String i = "イイイイイイイイイイ";

i.substring(0,5) + ","+i.substring(5,10)

Systemout.println(i);

として結果を

イイイイイ
イイイイイと文字列を分割しているのですが

10桁の文字列を半分に区切ろうとした場合

6文字目に濁点が存在した場合

String i = "イイイイバイバイ";

i.substring(0,5) + ","+i.substring(5,10)

結果が

イイイイハ
゛イバイ
と バの濁点とハが分割されてしまいます。

この半角カタカナの文字列でこの現象を
回避するために
文字列の中で濁点がヒットした場合
文字列の濁点を含んだ文字列の前か後ろで
イイイイ
ハ゛イバイ

もしくは

イイイイハ゛
イバイ
のように

分割させたいのですがなにか良い方法はありませんでしょうか??

どうぞよろしくお願いします。

投稿日時 - 2012-09-30 10:58:42

QNo.7724475

すぐに回答ほしいです

質問者が選んだベストアンサー

>3分割や分割区分が複数になる場合、IF文ですと条件が増えてしまうので
>なにか良い方法はないかなと思ったのですが・・・

「分割区分が複数」というのが何の事かわかりませんが
5桁毎にn分割なら以下のような感じで書けると思いますけど。

List<String> a = new ArrayList<String>();
String s = "ハハハハバハハハハバハハハ";
int w = 5;
int n = 3;
for (int i = 0; (i < n - 1) && (s.length() > w); i++) {
String s1 = s.substring(0, w);
String s2 = s.substring(w);
if (s2.startsWith("゛")) {
s1 = s1 + "゛";
s2 = s2.substring(1);
}
a.add(s1);
s = s2;
}
if (s.length() > 0)
a.add(s);

投稿日時 - 2012-10-03 02:16:53

お礼

ソースの方どうも
ありがとうございます。
あとはパ等小さい〇を考えれば
良いだけですね。
ちょっとサンプルから考えてみます。

投稿日時 - 2012-10-03 15:15:27

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(4)

おそらく所定の分割位置の文字が濁点のほか、半濁点、促音、拗音、かな小文字、長音の場合についても同様に調整した分割位置の割り出しが必要でしょう。
濁点、半濁点だけなら、一旦全角文字に置換してから分割後、半角文字に置換しても目的を果たせるでしょうけど、例えばデュプリーヴィクセンジャックマンのような文字列の分割時には、拗音、かな小文字、促音、長音の泣き別れに課題を残しそうです。

正規表現を使わなくても所定の分割位置の文字の一文字後ろが濁点、半濁点、拗音、促音、かな小文字、長音の場合、これら以外の文字が見つかるまで分割位置候補を一文字ずつ前方または後方に探せばいいでしょう。

投稿日時 - 2012-10-03 09:30:16

補足

アドバイスどうもありがとうございます。

分割前に文字を全角に置換して
分割後に半角に戻す考えは今でもございます。
バやピなどの文字以外は途中で分割されてしまっても構いません。

分割前に
import java.text.Normalizer;
import java.text.Normalizer.Form;

Normalizer.normalize(半角カナ, Form.NFKC);で
文字を全角に変換して分割しようと思ってたのですが
結果に文字を半角カナに戻すソースを
ご存じでしょうか??

投稿日時 - 2012-10-03 15:02:07

お礼

全角から半角にすべて置換するソース作りました。
アドバイスありがとうございます。

投稿日時 - 2012-10-04 08:35:13

ANo.2

>4桁目が濁点のケースもあり6桁目が濁点のケースも
>あるので濁点をヒットさせて分割方法を
>変えなければと思い投稿させていただきました。

5文字で分解するのに4桁目にある濁点と3桁目の文字が分かれることがあるんですか?
文字列を分割するときに濁点とその前の文字を分けたくないって質問だと思ったんですけど。

投稿日時 - 2012-09-30 12:24:26

補足

>5文字で分解するのに4桁目にある濁点と3桁目の文字が分かれることがあるんですか?
ございません。
検証の結果、単純な2分割ですとIF文で対応出来るのですが
今回説明が分かりやすいように、2等分に分割する例を上げました。
今回、伝えたかった事は
3分割や分割区分が複数になる場合、IF文ですと条件が増えてしまうので
なにか良い方法はないかなと思ったのですが・・・
うまく伝わらなくて申し訳ございません。
例えば5ケタ目が濁点のとき
6ケタと5ケタと4ケタで分割したとします。
そうしますと文字列の値によっては
5ケタで分割しようとした2つ目の配列にもし
濁点が含まれていた場合また条件を増やさなければいけなかったという事です。




分割前 ハハハハバハハハハハ
      バハハハハハ

分割後  ハハハハバ
       ハハハハハ
      ゛ハハハ
      
という結果になってしまうのです。
かといって配列2の値を6ケタで区切ると
他の文字列の
配列2の値の7ケタ目に
濁点が含まれた場合濁点と文字の途中で
分割されてしまうので・・・
なにか他に方法がなければ
アドバイス頂いた方法で考えて
ベストアンサーとして打ち切りさせて頂きます。

投稿日時 - 2012-10-02 08:37:10

お礼

訂正
補足例であげた分割前文字列は以下になります。

分割前の15ケタの文字列 ハハハハバハハハハバハハハ

投稿日時 - 2012-10-02 08:40:57

ANo.1

分割した後半部分の文字列先頭1文字が濁点だったら、前半部分の文字列最後の文字を後半部分の先頭に移すなり、後半部分の先頭の濁点を前半部分の文字列の最後に移したりすればよいだけでは?

投稿日時 - 2012-09-30 11:25:42

補足

文字列の値はどこに濁点が存在する
かわからないのでそれですと
今回質問しなくて済んでしまいます。
4桁目が濁点のケースもあり6桁目が濁点のケースも
あるので濁点をヒットさせて分割方法を
変えなければと思い投稿させていただきました。

投稿日時 - 2012-09-30 11:52:59

お礼

すいません。
勘違いしてました。
正規表現もしくは条件判定で、
ヒットさせるという事で
しょうか?

投稿日時 - 2012-09-30 11:57:45

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-