簡體   English   中英

在正則表達式中實現負向超前查找以排除代碼塊(如果其中包含某個字符串)

[英]Implementing a Negative Lookahead in Regex to exclude a block of code if it contains a certain string

這是我在此處發布的原始問題的后續措施,但是希望對擴展其功能有所幫助。 我有以下我要捕獲的字符串(我們稱其為輸出):

ltm pool TEST_POOL { 
    Some strings
    above headers
    records { 
        baz:1 {
            ANY STRING
            HERE
            session-status enabled
        } 
        foobar:23 { 
            ALSO ANY
            STRING HERE
            session-status enabled
        }
    }
    members {
        qux:45 {
            ALSO ANY
            STRINGS HERE
            session-status enabled
        }
        bash:2 {
            AND ANY
            STRING HERE
            session-status user-disabled
        }
        topaz:789 {
            AND ANY
            STRING HERE
            session-status enabled
        }        
    }
    Some strings
    below headers
}

考慮每條輸出線由典型的換行符分隔。 為了這個問題,讓我們將recordsmembers稱為“標題”,並將bazfoobarquxbashtopaz稱為“標題”。 我正在嘗試用Java編寫一個正則表達式,以捕獲給定標題括號之間的所有標題,除了那些包含字符串session-status user-disabled的字符串(如上所示)。 例如,假設我們要使用以下代碼查找標題members所有標頭:

String regex = "(?:\\bmembers\\s*\\{|(?<!^)\\G[^{]+\\{[^}]+\\})\\s*?\\n\\s*([^:{}]+)(?=:\\d)";
final Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(output);
while (matcher.find()) {
    System.out.println(matcher.group(1));
}

輸出應該只是...

qux
topaz

因此,它應該排除bash標頭,因為它在方括號之間具有session-status user-disabled 我在實現正則表達式時難以實現負前瞻。 另外, bazfoobar也不應匹配,因為它們一起包含在不同“ title”的括號內。 可以有任意數量的標題和任意數量的標題。 我們非常感謝您對我的正則表達式進行一些修改,以使其包含否定的前瞻性來解決此問題。

我從您之前的表達式開始構建,並添加了一個替換項,如果包含字符串session-status user-disabled ,它將嘗試使用非捕獲組匹配任何“標頭”。 這樣一來,那些“標題”將被否定,因為它們沒有被捕獲。 僅匹配包含已session-status enabled的字符串的“標題”標題。

這里的例子

(?:\bmembers\s*\{|(?<!^)\G)\s*?\n\s*(?:(?:[^{]*\{[^}]*?session-status user-disabled[^}]*\})|([^:{}]+)(?=:\d)[^{]*\{[^}]*\})

暫無
暫無

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

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