You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java正则表达式解析跨平台环境变量中密码参数需求

解决方法:兼容Linux/Windows的正则表达式提取

针对你需要提取-Dpassword值及前后内容的需求,这里提供一个能兼容两种操作系统格式的正则表达式方案,同时满足参数位置不固定、密码含双引号的场景:

正则表达式

String regex = "^(.*?-Dpassword=)(.*?)((?: -D.*)|\"|$)";

分组说明

这个正则会生成你需要的三个捕获分组:

  1. Group 1:从字符串开头到-Dpassword=的所有内容(包括-Dpassword=之前的参数和外层引号前缀)
  2. Group 2:-Dpassword=对应的完整值(包含双引号等特殊字符)
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:08:34