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

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


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);

}


九州编程
浏览 215回答 2
2回答

慕雪6442864

在 '=' 和 '";' 上拆分更简单。[ c.strip().split(' = ') for c in s.split('";') ]或者通过双重理解来获得各个路径:[ [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] 将是 vars,奇数 [1::2] 值然后摆脱值中的额外空白

烙印99

您可以使用以下正则表达式:(\w+)\s*=\s*([\s\S]+?)";它将首先匹配第 1 组Word字符、零个或多个White Spaces、一个equal sign、零White Space个或多个any字符,然后是第 2 组或多个字符 ( non greedy),最后是最后一个双精度值quote和 a semi colon。这将匹配所有行。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java