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)
促音・拗音の他に「ふぁいる」など小さな「ぁぃぅぇぉ」の入る単語もありますが、今回は考えないことにします。
Hira2Roma02.javaに次の部分を追加して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); }
ひらがなのファイルの名前をが変わっています。このファイルも新たに作ります。拗音を含むものにします。
ここに示したものは「ゃゅょ」を含むもののほとんど全部です。
きゃ きゅ きょ ぎゃ ぎゅ ぎょ しゃ しゅ しょ じゃ じゅ じょ ちゃ ちゅ ちょ ぢゃ ぢゅ ぢょ にゃ にゅ にょ ひゃ ひゅ ひょ びゃ びゅ びょ ぴゃ ぴゅ ぴょ みゃ みゅ みょ りゃ りゅ りょ
さらにメソッドを追加します。以下をまるごとmainやtransと同様なメソッドとして並べます。
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ではうまく行きません。そのつどネット検索などで調べるのが良いでしょう。
Hira2Roma03.javaをつくりなさい。変換するデータのファイルは前回のhiragana2.txtとは別に、hiragana3.txtをつくること。
ローマ字のつづり方の第1表だけを使うように変更した、Hira2Roma04.javaをつくりなさい。
マップの変更、sokuon()の変更、youon()の変更などが必要になります。メソッドの内容はより簡単になります。変換するデータのファイルは前回のhiragana.txt、hiragana2.txt、hiragana3.txtを一緒にしたhiragana4.txtをつくり全部が正常に変換できることを確認しなさい。