簡體   English   中英

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

[英]Need Regular Expression to parse multi-line environmental variables

我想解析一個文件,該文件是類似於此示例的環境變量列表:

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”與各個環境變量塊匹配。 第二種模式“模式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);
}

分割'='和'“;'更為簡單。

[ 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]值,然后除去值中多余的空格

您可以使用以下正則表達式:

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

它將通過匹配組1的啟動Word字符,零個或多個White Spaces ,一個equal sign ,零個或更多的White Space ,然后第2組以上的any字符( non greedy ),最后AA最后的雙quotesemi colon

那將匹配所有行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM