我想解析一個文件,該文件是類似于此示例的環境變量列表: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
提交
取消