拗音(ゃゅょ)を考慮する改良

一般的な拗音のつづり方

2つ書き方があるものは、今回は後ろの方を採用します。

きゃ(kya)     きゅ(kyu)     きょ(kyo)
ぎゃ(gya)     ぎゅ(gyu)     ぎょ(gyo)
しゃ(sya/sha)     しゅ(syu/shu)     しょ(syo/sho)
じゃ(zya/ja)     じゅ(zyu/ju)     じょ(zyo/jo)
ちゃ(tya/cha)     ちゅ(tyu/chu)     ちょ(tyo/cho)
ぢゃ(zya/ja)     ぢゅ(zyu/ju)     ぢょ(zyo/jo)
にゃ(nya)     にゅ(nyu)     にょ(nyo)
ひゃ(hya)     ひゅ(hyu)     ひょ(hyo)
びゃ(bya)     びゅ(byu)     びょ(byo)
ぴゃ(pya)     ぴゅ(pyu)     ぴょ(pyo)
みゃ(mya)     みゅ(myu)     みょ(myo)
りゃ(rya)     りゅ(ryu)     りょ(ryo)    

促音・拗音の他に「ふぁいる」など小さな「ぁぃぅぇぉ」の入る単語もありますが、今回は考えないことにします。

mainメソッドの書き換え

Hira2Roma02.javaに次の部分を追加してHira2Roma03.javaにします。

(1)はこの色の部分を追加します。mainメソッドの中です。減っている行もあります。

プログラム名 Hira2Roma03.java の一部 (1)mainに追加

        hiralines = kanayoui("hiragana3.txt");
        for ( String hira : hiralines ){
            String roma = trans(hira,hira2romamap);
            String roma2 = sokuon(roma);
            String roma3 = youon(roma2);
            System.out.println(hira);
            System.out.println(roma3);
        }

ひらがなのファイルも作り直し

ひらがなのファイルの名前をが変わっています。このファイルも新たに作ります。拗音を含むものにします。

ここに示したものは「ゃゅょ」を含むもののほとんど全部です。

ファイル名 hiragana3.txt

きゃ きゅ きょ
ぎゃ ぎゅ ぎょ
しゃ しゅ しょ
じゃ じゅ じょ
ちゃ ちゅ ちょ
ぢゃ ぢゅ ぢょ
にゃ にゅ にょ
ひゃ ひゅ ひょ
びゃ びゅ びょ
ぴゃ ぴゅ ぴょ
みゃ みゅ みょ
りゃ りゅ りょ  

「^ya」などの部分を書き換える新しいメソッド

さらにメソッドを追加します。以下をまるごとmainやtransと同様なメソッドとして並べます。

プログラム名 Hira2Roma03.java の一部 (2)メソッドの一つとして追加

    public static String youon(String line){
        String result = line;
        result = result.replaceAll("([sc]h)i\\^y([auo])","$1$2");
        result = result.replaceAll("ji\\^y([auo])","j$1");
        result = result.replaceAll("(.)i\\^(y[auo])","$1$2");
        return result;
    }

実行結果

きゃ きゅ きょ
kya kyu kyo
ぎゃ ぎゅ ぎょ
gya gyu gyo
しゃ しゅ しょ
sha shu sho
じゃ じゅ じょ
ja ju jo
ちゃ ちゅ ちょ
cha chu cho
ぢゃ ぢゅ ぢょ
ja ju jo
にゃ にゅ にょ
nya nyu nyo
ひゃ ひゅ ひょ
hya hyu hyo
びゃ びゅ びょ
bya byu byo
ぴゃ ぴゅ ぴょ
pya pyu pyo
みゃ みゅ みょ
mya myu myo
りゃ りゅ りょ  
rya ryu ryo  

解説

replaceAll()というメソッドは、与えられた文字列内に置換対象の文字列があれば、すべて指定されたものに置換します。

replaceAll(String regex, String replacement)

次の記述は、motoの文字列の中のkoreをareに置換して、chikangoに入れるというものです。

String moto, chikango;
chikango = moto.replaceAll("kore","are");

motoの文字列とchikangoの文字列が同じ名前の場合は、それ自身が変更されます。

文字列lineの中のshi^yaをshaにするには、

String result = line;
result = result.replaceAll("shi\\^ya","sha");

replaceAllの中では"^"が特別な意味を持ってしまうので、単なる"^"であることを指定するために"\\"をつけて書いていますが、shi^yaをshaにするということです。

さらにshi^yuをshuに、shi^yoをshoにするには、

String result = line;
result = result.replaceAll("shi\\^ya","sha");
result = result.replaceAll("shi\\^yu","shu");
result = result.replaceAll("shi\\^yo","sho");

と書くことになります。

replaceAll()というメソッドは、これをまとめて書くことができます。

String result = line;
result = result.replaceAll("shi\\^y([auo])","sh$1");

[auo]は、auoのどれかであることを表します。( )で囲まれていると、$1がその一致した文字を記憶します。

さらに、次のようにするとchi^ya chi^yu chi^yoも置換できます。

String result = line;
result = result.replaceAll("([sc]h)i\\^y([auo])","$1$2");

最初の([sc]h)の部分は、shかchにマッチします。そして$1がその一致した文字を記憶します。次の([auo])はauoのどれかとマッチして、2つ目の( )なので$2がその一致した文字を記憶します。$1$2と続けるとshかchにauoのどれかがついたものとなります。

次の"ji\\^y([auo])"は ji^ya ji^yu ji^yo のためです。置換後は jにauoのどれかがついたものとなります。

result = result.replaceAll("ji\\^y([auo])","j$1");

次は残りの"ki\\^ya"などを "kya" とする部分です。kに当たるところに(.)と書いています。ドットはどんな文字ともマッチします。( )で囲まれているので、それを$1に記憶します。置換後はこれにyとauoのどれかがついたものとなります。

 result = result.replaceAll("(.)i\\^(y[auo])","$1$2");

正規表現(せいきひょうげん)

[ ]や( )を使って一致させる文字列を指定することを正規表現といいます。

perl, ruby, php などいろいろな言語で使うことができます。linuxなどunix系のOSならばgrepやsed、awkなどのコマンドでも使うことができます。

正規表現はここでは説明しきれません。困ったことに言語が異なると微妙に書き方が変わったりします。例えば普通\^でいいものをjavaでは\\^と書きます。$1$2は\1\2と書くのが一般的ですが、javaではうまく行きません。そのつどネット検索などで調べるのが良いでしょう。

課題

1

Hira2Roma03.javaをつくりなさい。変換するデータのファイルは前回のhiragana2.txtとは別に、hiragana3.txtをつくること。

2

ローマ字のつづり方の第1表だけを使うように変更した、Hira2Roma04.javaをつくりなさい。

マップの変更、sokuon()の変更、youon()の変更などが必要になります。メソッドの内容はより簡単になります。変換するデータのファイルは前回のhiragana.txt、hiragana2.txt、hiragana3.txtを一緒にしたhiragana4.txtをつくり全部が正常に変換できることを確認しなさい。