javaで環境変数の置換を実行する関数を作成しようとしています。したがって、このような文字列がある場合:テキスト内の環境変数を展開する
ユーザー$ {USERNAME}さんのAPPDATAパスは $ {APPDATA}です。
私は結果になりたい:\ Users \ユーザーmsmith \のAppData \ローミング:
ユーザーmsmithのAPPDATAパスは Cです。
public static String expandEnvVars(String text) { Map<String, String> envMap = System.getenv(); String pattern = "\\$\\{([A-Za-z0-9]+)\\}"; Pattern expr = Pattern.compile(pattern); Matcher matcher = expr.matcher(text); if (matcher.matches()) { for (int i = 1; i <= matcher.groupCount(); i++) { String envValue = envMap.get(matcher.group(i).toUpperCase()); if (envValue == null) { envValue = ""; } else { envValue = envValue.replace("\\", "\\\\"); } Pattern subexpr = Pattern.compile("\\$\\{" + matcher.group(i) + "\\}"); text = subexpr.matcher(text).replaceAll(envValue); } } return text; }
falseを返します
matcher.matches()
上記のサンプルテキストを、使用:
これまでのところ、私の壊れた実装では、このようになります。しかし、私のサンプルテキストが${APPDATA}
であれば動作します。
誰でも手助けできますか?
これは機能します。ありがとう! –
@Michael、あなたは大歓迎です。 – jjnguy
この場合、返された文字列の$ {}部分をエスケープする必要があるため、matcher.group(0)を使用した例がスローされます。だから代わりに式の代わりに "\\ $ \\ {" + matcher.group(1)+ "\\}"を使いました。 –