package com.brightgenerous.commons; import java.util.HashSet; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; public class StringConvertUtils { public static enum Mode { ALL, SYMBOL, ALPHABET, NUMBER, KATAKANA; } private StringConvertUtils() { } public static String toSnakeCase(String str) { return toSnakeCase(str, false); } public static String toSnakeCase(String str, boolean separateNumber) { if (str == null) { return null; } String ret = str.replaceAll("([A-Z]+)([A-Z][a-z])", "$1_$2") .replaceAll("([a-z])([A-Z])", "$1_$2").toLowerCase(); if (separateNumber) { ret = ret.replaceAll("([a-z])([0-9])", "$1_$2").replaceAll("([0-9])([a-z])", "$1_$2"); } return ret; } public static String toCamelCase(String str) { return toCamelCase(str, false); } public static String toCamelCase(String str, boolean separateNumber) { if (str == null) { return null; } Pattern p; if (separateNumber) { p = Pattern.compile("_([0-9a-z])"); } else { p = Pattern.compile("_([a-z])"); } Matcher m = p.matcher(str.toLowerCase()); StringBuffer sb = new StringBuffer(str.length()); while (m.find()) { m.appendReplacement(sb, m.group(1).toUpperCase()); } m.appendTail(sb); return sb.toString(); } public static String toHalf(String str) { return toHalf(str, Mode.ALL); } public static String toHalf(String str, Mode mode, Mode... modes) { if (str == null) { return null; } String ret = str; for (Mode m : compressModes(mode, modes)) { switch (m) { case ALL: ret = StringConvertFullToHalfUtils.convertToHalfCharacter(ret); break; case SYMBOL: ret = StringConvertFullToHalfUtils.convertToHalfSymbol(ret); break; case NUMBER: ret = StringConvertFullToHalfUtils.convertToHalfNumber(ret); break; case ALPHABET: ret = StringConvertFullToHalfUtils.convertToHalfAlphabet(ret); break; case KATAKANA: ret = StringConvertFullToHalfUtils.convertToHalfKatakana(ret); break; } } return ret; } public static String toFull(String str) { return toFull(str, Mode.ALL); } public static String toFull(String str, Mode mode, Mode... modes) { if (str == null) { return null; } String ret = str; for (Mode m : compressModes(mode, modes)) { switch (m) { case ALL: ret = StringConvertHalfToFullUtils.convertToFullCharacter(ret); break; case SYMBOL: ret = StringConvertHalfToFullUtils.convertToFullSymbol(ret); break; case NUMBER: ret = StringConvertHalfToFullUtils.convertToFullNumber(ret); break; case ALPHABET: ret = StringConvertHalfToFullUtils.convertToFullAlphabet(ret); break; case KATAKANA: ret = StringConvertHalfToFullUtils.convertToFullKatakana(ret); break; } } return ret; } private static Set<Mode> compressModes(Mode mode, Mode... modes) { Set<Mode> ret = new HashSet<>(); loop: { if (mode != null) { ret.add(mode); if (mode.equals(Mode.ALL)) { break loop; } } if ((modes != null) && (0 < modes.length)) { for (Mode m : modes) { if ((m != null) && !ret.contains(m)) { ret.add(m); if (m.equals(Mode.ALL)) { break loop; } } } } } if ((ret.contains(Mode.ALL) && (1 < ret.size())) || (ret.contains(Mode.SYMBOL) && ret.contains(Mode.ALPHABET) && ret.contains(Mode.NUMBER) && ret.contains(Mode.KATAKANA))) { ret.clear(); ret.add(Mode.ALL); } return ret; } }