我想解析一个文件,该文件是类似于此示例的环境变量列表: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] 值然后摆脱值中的额外空白
烙印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
。
这将匹配所有行。
添加回答
举报
0/150
提交
取消