为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

九州编程 2021-12-22 20:42:54
我想解析一个文件,该文件是类似于此示例的环境变量列表: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 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

在 '=' 和 '";' 上拆分更简单。

[ 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] 值然后摆脱值中的额外空白


查看完整回答
反对 回复 2021-12-22
?
烙印99

TA贡献1829条经验 获得超13个赞

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

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

它将首先匹配第 1 组Word字符、零个或多个White Spaces、一个equal sign、零White Space个或多个any字符,然后是第 2 组或多个字符 ( non greedy),最后是最后一个双精度值quote和 a semi colon

这将匹配所有行。


查看完整回答
反对 回复 2021-12-22
  • 2 回答
  • 0 关注
  • 212 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信