正規表現でソースコード中の日本語ベタ打ちを抽出
現在、開発中のシステムで多国語対応(国際化対応?多言語対応?i18n対応?なんていうのが正式?)の必要が出てきたため、その対応に追われております。Javaにはpropertiesファイルによる多国語対応の仕組みがあるので、当然それを採用するんだけど、jspはそんなに数も多くないのでシーケンシャルアクセスで調べてもそんな大変じゃない。しかし、Javaのソースコードに埋め込まれた日本語を探し当てるのは結構大変。数が多いからー。
そんな時、メンバーで分担して見ていくか、という話も出たけど、ちょっと待て、僕らはプログラムが書けるじゃないか。そういう機械的な作業は文字通り機械にやってもらいましょう、と言うことで作ったプログラムを公開。
本当は30分くらいでぱぱっと作りたかったけど1時間かかってしまった。。こういうときにスクリプト言語に通じていればもう少し時間・行数ともに少なく書けるんだろうなぁ。
ポイントは正規表現のところです。Shift_JISのほとんどはこれでいける、とこちらにありました。参考にさせていただきました。ありがとうございます。
本当は除外条件(javadoc部とコメント部を除いている)もあわせて1行で書きたかったんだけど、分かりませんでした。誰か教えてくれると嬉しいです。
※「とかの記号類はヒットしない模様です。
public class Main { private static final String regex = ".*([ぁ-ヶ]|[亜-鄢])+.*"; private static final String excludeRegex1 = ".*\\*.*"; private static final String excludeRegex2 = ".*\\/\\/.*"; public static void main(String[] args) throws Exception { File targetDirectory = new File(args[0]); execute(targetDirectory, getUnderNames(targetDirectory)); } private static void execute(File directory, String[] names) throws FileNotFoundException, IOException { for (String name : names) { File target = new File(directory, name); if (target.isFile()) { printIncludingJapaneseLine(target); } else if( target.isDirectory()) { execute(target, getUnderNames(target)); } } } private static void printIncludingJapaneseLine(File f) throws FileNotFoundException, IOException { BufferedReader reader = null; try { String line = null; boolean isFirst = true; int count = 0; reader = new BufferedReader(new FileReader(f)); while ((line = reader.readLine()) != null) { ++count; if (line.matches(regex) && !line.matches(excludeRegex1) && !line.matches(excludeRegex2)) { if (isFirst) { System.out.println ("■" + f.getName()); isFirst = false; } System.out.println("\t" + count + ":" + line.trim()); } } } finally { reader.close(); } } private static String[] getUnderNames(File targetDirectory) { String[] names = targetDirectory.list(new FilenameFilter() { public boolean accept(File dir, String name) { if (name.matches(".*\\.java")) { return true; } return new File(dir, name).isDirectory(); } }); return names; } }