亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

需要正則表達式解析多行環境變量

需要正則表達式解析多行環境變量

九州編程 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 關注
  • 243 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號