lacolaco
1/27/2013 - 2:30 PM

和文らこらこ文

和文らこらこ文

import java.util.ArrayList;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 和文らこらこ変換ライブラリ
 */
public class Lacolaco
{
	
	private static HashMap<String, String> jaLc;
	private static HashMap<String, String> lcJa;

	/**
	 * 与えられた文字列がらこらこ文を含むかどうかを返す
	 * @param lc 判定する文字列
	 * @return らこらこ文を含むならtrue,そうでなければfalse
	 */
	public static boolean isLacolaco(String lc)
	{
		Pattern pattern = Pattern.compile("[らこ]+");
		Matcher matcher = pattern.matcher(lc);
		ArrayList<String> list = new ArrayList<String>();
		while(matcher.find())
		{
			list.add(matcher.group());
		}
		if(list.size() <= 1)
		{
			return false;
		}
		else
		{
			for(String s: list)
			{
				if(!s.equals("らこ") && !s.equals("ら") && !s.equals("こ"))
				{
					return true;
				}
			}
			return false;
		}
	}

	/**
	 * 和文らこらこをカタカナ・数字に復元する	 *
	 * @param str 復元したい文字列
	 * @return 復元部分が置換された文字列
	 */
	public static String lcToJa(String str)
	{
		String[] strArr = toRightLacolaco(str).split("~");
		StringBuilder sb = new StringBuilder();
		for (String tok : strArr)
		{
			sb.append(lcJa.containsKey(tok) ? lcJa.get(tok) : tok);
		}
		return sb.toString();
	}

	/**
	 * ひらがな・カタカナ・数字をらこらこ文に変換する
	 * @param str 変換したい文字列
	 * @return 変換部分が置換された文字列
	 */
	public static String jaToLc(String str)
	{
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < str.length(); i++)
		{
			String tok = String.valueOf(str.charAt(i));
			if(jaLc.containsKey(tok))
			{
				sb.append(jaLc.get(tok));
				sb.append("~");
			}
			else
			{
				sb.append(tok);
			}
		}
		return sb.toString().trim();
	}


	private static String toRightLacolaco(String str)
	{
		str = str.replace("~", "~").trim();
		Pattern pattern = Pattern.compile("[^らこ~][らこ]");
		StringBuilder sb = new StringBuilder(str);
		Matcher matcher = pattern.matcher(str);
		while(matcher.find())
		{
			int i = matcher.start();
			sb.insert(i + 1, "~");
			matcher.reset(sb);
		}
		pattern = Pattern.compile("[らこ][^らこ~]");
		matcher = pattern.matcher(sb);
		while(matcher.find())
		{
			int i = matcher.start();
			sb.insert(i + 1, "~");
			matcher.reset(sb);
		}
		return sb.toString();
	}

	static
	{
		jaLc = new HashMap<String, String>();
		lcJa = new HashMap<String, String>();

		String[][] ja2 = {{"らこ", "イ"}, {"らこらこ", "ロ"}, {"こららら", "ハ"}, {"こらこら", "ニ"}, {"こらら", "ホ"},
				{"ら", "ヘ"}, {"ららこらら", "ト"}, {"ららこら", "チ"}, {"ここら", "リ"}, {"らららら", "ヌ"},
				{"こらここら", "ル"}, {"らこここ", "ヲ"}, {"こらこ", "ワ"}, {"らこらら", "カ"}, {"ここ", "ヨ"},
				{"こら", "タ"}, {"こここ", "レ"}, {"こここら", "ソ"}, {"らここら", "ツ"}, {"ここらこ", "ネ"},
				{"らこら", "ナ"}, {"ららら", "ラ"}, {"こ", "ム"}, {"ららこ", "ウ"}, {"らこららこ", "ヰ"},
				{"ららここ", "ノ"}, {"らこららら", "オ"}, {"らららこ", "ク"}, {"らここ", "ヤ"}, {"こららこ", "マ"},
				{"こらここ", "ケ"}, {"ここらら", "フ"}, {"ここここ", "コ"}, {"こらこここ", "エ"}, {"らこらここ", "テ"},
				{"ここらここ", "ア"}, {"こらこらこ", "サ"}, {"こらこらら", "キ"}, {"こららここ", "ユ"}, {"こらららこ", "メ"},
				{"ららこらこ", "ミ"}, {"ここらこら", "シ"}, {"らここらら", "ヱ"}, {"ここららこ", "ヒ"}, {"こららこら", "モ"},
				{"らこここら", "セ"}, {"こここらこ", "ス"}, {"らこらこら", "ン"}, {"らら", "゛"}, {"ららここら", "゜"},
				{"らここらこ", "ー"}, {"らこらこらこ", "、"}, {"こらここらこ", "("}, {"らこららこら", ")"}, {"らここここ", "1"},
				{"ららこここ", "2"}, {"らららここ", "3"}, {"ららららこ", "4"}, {"ららららら", "5"}, {"こらららら", "6"},
				{"ここららら", "7"}, {"こここらら", "8"}, {"ここここら", "9"}, {"こここここ", "0"}, {"", ""}};
		for(String[] pr : ja2)
		{
			lcJa.put(pr[0], pr[1]);
			jaLc.put(pr[1], pr[0]);
		}

		String[][] ja1 = {{"い", "らこ"}, {"ィ", "らこ"}, {"ぃ", "らこ"}, {"ろ", "らこらこ"}, {"は", "こららら"},
				{"に", "こらこら"}, {"ほ", "こらら"}, {"へ", "ら"}, {"と", "ららこらら"}, {"ち", "ららこら"},
				{"り", "ここら"}, {"ぬ", "らららら"}, {"る", "こらここら"}, {"を", "らこここ"}, {"わ", "こらこ"},
				{"ヮ", "こらこ"}, {"ゎ", "こらこ"}, {"か", "らこらら"}, {"ヵ", "らこらら"}, {"よ", "ここ"},
				{"ョ", "ここ"}, {"ょ", "ここ"}, {"た", "こら"}, {"れ", "こここ"}, {"そ", "こここら"},
				{"つ", "らここら"}, {"ッ", "らここら"}, {"っ", "らここら"}, {"ね", "ここらこ"}, {"な", "らこら"},
				{"ら", "ららら"}, {"む", "こ"}, {"う", "ららこ"}, {"ゥ", "ららこ"}, {"ぅ", "ららこ"},
				{"ゐ", "らこららこ"}, {"の", "ららここ"}, {"お", "らこららら"}, {"ォ", "らこららら"}, {"ぉ", "らこららら"},
				{"く", "らららこ"}, {"や", "らここ"}, {"ャ", "らここ"}, {"ゃ", "らここ"}, {"ま", "こららこ"},
				{"け", "こらここ"}, {"ヶ", "こらここ"}, {"ふ", "ここらら"}, {"こ", "ここここ"}, {"え", "こらこここ"},
				{"ェ", "こらこここ"}, {"ぇ", "こらこここ"}, {"て", "らこらここ"}, {"あ", "ここらここ"}, {"ァ", "ここらここ"},
				{"ぁ", "ここらここ"}, {"さ", "こらこらこ"}, {"き", "こらこらら"}, {"ゆ", "こららここ"}, {"ュ", "こららここ"},
				{"ゅ", "こららここ"}, {"め", "こらららこ"}, {"み", "ららこらこ"}, {"し", "ここらこら"}, {"ゑ", "らここらら"},
				{"ひ", "ここららこ"}, {"も", "こららこら"}, {"せ", "らこここら"}, {"す", "こここらこ"}, {"ん", "らこらこら"},
				{"ガ", "らこらら らら"}, {"が", "らこらら らら"}, {"ギ", "こらこらら らら"}, {"ぎ", "こらこらら らら"}, {"グ", "らららこ らら"},
				{"ぐ", "らららこ らら"}, {"ゲ", "こらここ らら"}, {"げ", "こらここ らら"}, {"ゴ", "ここここ らら"}, {"ご", "ここここ らら"},
				{"ザ", "こらこらこ らら"}, {"ざ", "こらこらこ らら"}, {"ジ", "ここらこら らら"}, {"じ", "ここらこら らら"}, {"ズ", "こここらこ らら"},
				{"ず", "こここらこ らら"}, {"ゼ", "らこここら らら"}, {"ぜ", "らこここら らら"}, {"ゾ", "こここら らら"}, {"ぞ", "こここら らら"},
				{"ダ", "こら らら"}, {"だ", "こら らら"}, {"ヂ", "ららこら らら"}, {"ぢ", "ららこら らら"}, {"ヅ", "らここら らら"},
				{"づ", "らここら らら"}, {"デ", "らこらここ らら"}, {"で", "らこらここ らら"}, {"ド", "ららこらら らら"}, {"ど", "ららこらら らら"},
				{"バ", "こららら らら"}, {"ば", "こららら らら"}, {"ビ", "ここららこ らら"}, {"び", "ここららこ らら"}, {"ブ", "ここらら らら"},
				{"ぶ", "ここらら らら"}, {"ベ", "ら らら"}, {"べ", "ら らら"}, {"ボ", "こらら らら"}, {"ぼ", "こらら らら"},
				{"パ", "こららら ららここら"}, {"ぱ", "こららら ららここら"}, {"ピ", "ここららこ ららここら"}, {"ぴ", "ここららこ ららここら"}, {"プ", "ここらら ららここら"},
				{"ぷ", "ここらら ららここら"}, {"ペ", "ら ららここら"}, {"ぺ", "ら ららここら"}, {"ポ", "こらら ららここら"}, {"ぽ", "こらら ららここら"},
				{"ヴ", "ららこ らら"}};
		for(String[] to : ja1) jaLc.put(to[0], to[1]);
	}
}