[英]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
}
考慮每條輸出線由典型的換行符分隔。 為了這個問題,讓我們將records
和members
稱為“標題”,並將baz
, foobar
, qux
, bash
和topaz
稱為“標題”。 我正在嘗試用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
。 我在實現正則表達式時難以實現負前瞻。 另外, baz
和foobar
也不應匹配,因為它們一起包含在不同“ 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.