代码之家  ›  专栏  ›  技术社区  ›  PentiumPro200

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

  •  2
  • PentiumPro200  · 技术社区  · 7 年前

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

    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);
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Poul Bak    7 年前

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

    (\w+)\s*=\s*([\s\S]+?)";
    

    它将首先匹配一组 Word 字符,零或更多 White Spaces equal sign White Space ,然后是2组或更多 any 人物( non greedy )最后是最后一个双人 quote 和一个 semi colon .

    所有的线都匹配。

        2
  •  2
  •   Serge    7 年前

    [ 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]值