Java正则表达式解析跨平台环境变量中密码参数需求
解决方法:兼容Linux/Windows的正则表达式提取
针对你需要提取-Dpassword值及前后内容的需求,这里提供一个能兼容两种操作系统格式的正则表达式方案,同时满足参数位置不固定、密码含双引号的场景:
正则表达式
String regex = "^(.*?-Dpassword=)(.*?)((?: -D.*)|\"|$)";
分组说明
这个正则会生成你需要的三个捕获分组:
- Group 1:从字符串开头到
-Dpassword=的所有内容(包括-Dpassword=之前的参数和外层引号前缀) - Group 2:
-Dpassword=对应的完整值(包含双引号等特殊字符) - Group 3:密码之后的所有内容(Linux下是结尾的闭合引号,Windows下是后续参数或空字符串)
正则逻辑拆解
让我们逐个部分分析:
^(.*?-Dpassword=):从字符串起始位置开始,非贪婪匹配到-Dpassword=为止的所有内容,确保不会跳过前面的其他-D参数。(.*?):非贪婪匹配密码值,直到遇到以下终止条件之一:(?: -D.*):下一个以-D开头的参数(Windows多参数场景)":Linux格式下的外层闭合引号$:字符串结尾(无后续内容的场景)
((?: -D.*)|\"|$):捕获密码之后的所有剩余内容,涵盖三种终止情况。
Java代码示例
下面是一个完整的Java代码片段,验证三种测试场景:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class EnvVarExtractor { public static void main(String[] args) { String regex = "^(.*?-Dpassword=)(.*?)((?: -D.*)|\"|$)"; Pattern pattern = Pattern.compile(regex); // Linux场景 String linuxEnv = "MY_ARGS=\"-DusePassword=true -Dpassword=pa\"ss\""; Matcher linuxMatcher = pattern.matcher(linuxEnv); if (linuxMatcher.find()) { System.out.println("Linux场景:"); System.out.println("Group 1: " + linuxMatcher.group(1)); System.out.println("Group 2: " + linuxMatcher.group(2)); System.out.println("Group 3: " + linuxMatcher.group(3)); } // Windows场景1(无后续参数) String winEnv1 = "MY_ARGS=-DusePassword=true -Dpassword=pa\"ss"; Matcher winMatcher1 = pattern.matcher(winEnv1); if (winMatcher1.find()) { System.out.println("\nWindows场景1:"); System.out.println("Group 1: " + winMatcher1.group(1)); System.out.println("Group 2: " + winMatcher1.group(2)); System.out.println("Group 3: '" + winMatcher1.group(3) + "'"); } // Windows场景2(带后续参数) String winEnv2 = "MY_ARGS=-DusePassword=true -Dpassword=pa\"ss -Duser=somebody"; Matcher winMatcher2 = pattern.matcher(winEnv2); if (winMatcher2.find()) { System.out.println("\nWindows场景2:"); System.out.println("Group 1: " + winMatcher2.group(1)); System.out.println("Group 2: " + winMatcher2.group(2)); System.out.println("Group 3: " + winMatcher2.group(3)); } } }
输出结果
运行上述代码会得到:
Linux场景: Group 1: MY_ARGS="-DusePassword=true -Dpassword= Group 2: pa"ss Group 3: " Windows场景1: Group 1: MY_ARGS=-DusePassword=true -Dpassword= Group 2: pa"ss Group 3: '' Windows场景2: Group 1: MY_ARGS=-DusePassword=true -Dpassword= Group 2: pa"ss Group 3: -Duser=somebody
完全符合你的期望结果!
内容的提问来源于stack exchange,提问作者f0lik
相关产品推荐
相关产品推荐

