前回、置換に関する記事をまとめましたが動的な置換について勉強する機会があったのでまとめておきます。一般に置換表現というのはほとんどが静的なものかと思います。
例えば
<intpu type=”text” value=”hogehoge”>
↓
<intpu type=”text” value=”foofoo”>
のように規則性は複雑でもAをBに変換するというのは変わらないわけです。
Contents
動的な置換
今回の仕事であったのはこれまでやっていた静的な置換ではなく、動的な置換です。
具体的には
- 変数をキャメルケース化する
(例 abc_def→abcDef) - 数値をキーにして値を入力する
(例 label_123→csvファイルを見に行き123:testとなっている場合、label_testとする)
といったものです。
今までこのケースはやっていなかったのでかなり大変でしたが、調べたことで置換のパターンをまたひとつ増やすことができましたね。
実際に書いたコードは下記のようなものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public String customizeReplace(Map<String,String> regexHash,String htmlString, boolean... toUpper){ //regexHashには正規表現のパターンのbeforeRegex,afterRegexが入っています。 Pattern p = Pattern.compile(regexHash.get("beforeRegex")); Matcher m = p.matcher(htmlString); //ここに変換したい文字列を入れます。 StringBuffer sb = new StringBuffer(); while (m.find()) { m.appendReplacement(sb, customizeReplaceChara(m,regexHash)); } m.appendTail(sb); return sb.toString(); } private String customizeReplaceChara(Matcher matcher, Map<String,String> regexHash) { //正規表現は基本的に hogehoge=(.*?) のように一箇所一致するところがある //()でキャッチしたものはgroup(1)として取得している String extractStr = matcher.group(1); //ここで抽出した文字を何らかの規則で変換するgetLabelFieldNameはそのための処理 replacedExtraStr = getLabelFieldName(extractStr); return replaceExtraStr } } |
これで置換ができました。
ちなみにキャメルケースとスネークケースの変換も書いておきます。
結構需要ありそう・・・
キャメルケースに変換
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
private String camelize(String str){ Pattern pattern=Pattern.compile("[^_]+"); Matcher matcher=pattern.matcher(str); StringBuilder buffer=new StringBuilder(); while(matcher.find()){ buffer.append(matcher.group(0).substring(0,1).toUpperCase()); buffer.append(matcher.group(0).substring(1)); } String result=buffer.toString(); //頭の文字が存在していたら小文字にする if( !result.isEmpty() && !result.substring(0,1).isEmpty() && !result.substring(1).isEmpty() ){ result=result.substring(0,1).toLowerCase()+result.substring(1); } return result; } |
スネークケースに変換
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public static String underscore(String str ){ Pattern pattern=Pattern.compile("[A-Z]+[a-z\\d]+"); Matcher matcher=pattern.matcher(str); StringBuffer buffer=new StringBuffer(); while(matcher.find()){ buffer.append("_"); buffer.append(matcher.group(0).toLowerCase()); } String result=buffer.toString().substring(1); if(!result.isEmpty() && !result.substring(0,1).isEmpty() && !result.substring(1).isEmpty() ){ result=result.toUpperCase(); } return result; } |