我正在尝试编写一个函数来执行Java中环境变量的替换。因此,如果我有一个看起来像这样的字符串:
用户$ {USERNAME}的APPDATA路径为$ {APPDATA}。
我希望结果是:
用户msmith的APPDATA路径为C:\ Users \ msmith \ AppData \ Roaming。
到目前为止,我坏了的实现看起来像这样:
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;
}
使用上面的示例文本,matcher.matches()
返回false。但是,如果我的示例文本是${APPDATA}
可行的。
有人可以帮忙吗?
您不想使用matches()
。匹配项将尝试匹配整个输入字符串。
尝试根据图案匹配整个区域。
你想要的是while(matcher.find()) {
。这将匹配您的模式的每个实例。请查看的文档find()
。
在每个匹配项中,group 0
将是整个匹配的字符串(${appdata}
),group 1
并将是appdata
一部分。
您的最终结果应类似于:
String pattern = "\\$\\{([A-Za-z0-9]+)\\}";
Pattern expr = Pattern.compile(pattern);
Matcher matcher = expr.matcher(text);
while (matcher.find()) {
String envValue = envMap.get(matcher.group(1).toUpperCase());
if (envValue == null) {
envValue = "";
} else {
envValue = envValue.replace("\\", "\\\\");
}
Pattern subexpr = Pattern.compile(Pattern.quote(matcher.group(0)));
text = subexpr.matcher(text).replaceAll(envValue);
}
问题内容: 在我的.sh文件中,我有此文件,而$ SOME_PATH导出为。但是,当我运行此.sh文件时,出现了错误消息,例如不存在这样的“〜/ path / to / path /”。 我将〜替换为$ HOME,然后错误消失了。那么代字号在这儿呢? 提前致谢。 问题答案: 采用 如果路径中有空格,请引用它
问题内容: Jenkins(管理jenkins->系统信息)下的环境变量从何而来? 我检查了/etc/init.d/tomcat5,/ usr / bin / dtomcat5,/ usr / bin / tomcat5,/ etc / sysconfig / tomcat5和/ etc / profile,但在那里没有看到任何此类变量,特别是与Oracle相关的变量(Base,Home,Ld_l
问题内容: 我有一个带有PropertyPlaceholderConfigurer的Spring application- context.xml,可以从.properties文件中获取属性的值。主和测试源文件夹具有单独的.properties文件。问题是我需要在.properties文件中使用环境变量。但是当我通过以下方式进行操作时: 我收到以下错误: 而占位符配置器定义为 关于如何使prope
我正在做一个Jenkins的工作,它接受来自用户的一些参数。我遇到了一个不希望的行为:在我的脚本有机会读取环境变量之前,Jenkins似乎在参数环境变量中扩展了环境变量引用。 如果用户输入 作为参数,我的脚本实际看到的是 的内容;环境变量已展开。如果输入的值包含 我的脚本只能看到一个 。但是,如果它包含环境中不存在,则该值将保持不变(不会引发任何类型的错误)。 这很不方便,因为它甚至出现在密码字段
我猜这是因为它没有$app_vol_dir,但为什么会这样呢?如果docker compose扩展了另一个定义Environment:variables的compose文件
问题内容: 我正在尝试为ProcessBuilder对象添加环境变量,但是当我在ProcessBuilder中调用该新变量时,出现错误。这就是我建立流程的方式 我得到了错误 我不明白,如果我只是为此过程设置变量,为什么会出现错误。请帮助我如何设置env变量,以便可以在ProcessBuilder中使用它。 问题答案: Alfredo O的示例为您提供了正确的想法。您需要告诉ProcessBuild