Java 需要正则表达式来解析多行环境变量

Java 需要正则表达式来解析多行环境变量,java,regex,Java,Regex,我想解析一个文件,它是一个环境变量列表,类似于此示例: TPS_LIB_DIR = "$DEF_VERSION_DIR\lib\ver215"; TPS_PH_DIR = "$DEF_VERSION_DIR"; TPS_SCHEMA_DIR = "~TPS_DIR\Supersedes\code;" + "~TPR_DIR\..\Supersedes\code;" + "~TPN_DIR\..\..\Supersedes\cod

我想解析一个文件,它是一个环境变量列表,类似于此示例:

TPS_LIB_DIR = "$DEF_VERSION_DIR\lib\ver215";

TPS_PH_DIR = "$DEF_VERSION_DIR";

TPS_SCHEMA_DIR = "~TPS_DIR\Supersedes\code;" +
                "~TPR_DIR\..\Supersedes\code;" +
                "~TPN_DIR\..\..\Supersedes\code;" +
                "$TPS_VERSION_DIR";

TPS_LIB_DIR = "C:\prog\lib";

BASE_DIR     = "C:\prog\base";

SPARS_DIR    = "C:\prog\spars";

SIGNALFILE_DIR = "E:\SIGNAL_FILES";
SIGNALFILE2_DIR = "E:\SIGNAL_FILES2";
SIGNALFILE3_DIR = "E:\SIGNAL_FILES2";
我提出了一个正则表达式,它可以很好地匹配单行定义,但不能匹配多行定义

(\w+)\s*=\s*(.*);[\r\n]+
是否有人知道一个正则表达式,它将解析此文件中的所有行,其中环境变量名位于组1中,值(位于=)位于组2中?如果多条路径在单独的组中,则更好,但我可以手动处理该部分

更新:

以下是我最终实现的内容。第一个模式“模式p”匹配单个环境变量块。第二种模式“pattern valpattern”解析每个环境变量的一个或多个值。希望有人觉得这个有用

private static void parse(File filename) {
    Pattern p = Pattern.compile("(\\w+)\\s*=\\s*([\\s\\S]+?\";)");
    Pattern valpattern = Pattern.compile("\\s*\"(.+)\"\\s*");
    try {
        String str = readFile(filename, StandardCharsets.UTF_8);
        Matcher matcher = p.matcher(str);
        while(matcher.find()) {
            String key = matcher.group(1);
            Matcher valmatcher = valpattern.matcher(matcher.group(2));
            System.out.println(key);
            while(valmatcher.find()) {                  
                System.out.println("\t" + valmatcher.group(1).replaceAll(System.getProperty("line.separator"), ""));
            }
        }
    } catch (IOException e) {
        System.out.println("Error: ProcessENV.parse -- problem parsing file: " + filename + System.lineSeparator());
        e.printStackTrace();
    }
}

static String readFile(File file, Charset encoding) throws IOException {
    byte[] encoded = Files.readAllBytes(file.toPath());
    return new String(encoded, encoding);
}

在“=”和“”;”上拆分更简单

或者通过双重理解来获得单独的路径:

[ [p[0].strip(), * [x.strip() for x in p.strip().split('=')] for c in s.split('";') for p in c.split(" = ")] 
拆分可以通过re完成,添加\s*以删除尾随空格:

 re.split(r'\s*=\s*|";\s*', text, flags=re.MULTILINE):
偶数元素r[::2]将是变量,奇数[1::2]值
然后去掉值中多余的空白

您可以使用以下正则表达式:

(\w+)\s*=\s*([\s\S]+?)";
它将首先匹配第一组
字符,零个或多个
空格
,一个
等号
,零个或多个
空格
,然后匹配第二组或多个
任意
字符(
非贪婪
),最后匹配最后一个双引号和一个
分号


这将匹配所有行。

什么环境承载regex解析器?@ΩmegaMan,在Java和Windows上运行
(\w+)\s*=\s*([\s\S]+?)";