[英]Regex - Matching a pattern not containing a string
我見過其他類似的問題,但它們都是關於結尾處匹配的問題,這不是我想要的。
我想用語法匹配參數:
{{param-name}}
或{{param-name=default value}}
到目前為止,我有以下正則表達式:
(\{\{[a-zA-Z0-9_-]*(?:=.*)?\}\})
但是問題是,如果有多個參數,它將僅創建一個匹配項:從第一個匹配項的開始到最后一個匹配項的結束。 例如 :
bla bla {{foo=blabla}} bla bla {{bar=hehe}} bla bla
將匹配: {{foo}} bla bla {{bar=hehe}}
而我想要{{foo}}
和{{bar=hehe}}
因此,我需要檢查=
字符之后,在}}
終止參數之前是否沒有}}
字符串。
我不知道該怎么做。 你能幫助我嗎 ? 謝謝 :)
PS:如果重要的話,我正在Java中使用它。
將=
后的.*
設為非貪婪。
(\{\{[a-zA-Z0-9_-]*(?:=.*?)?\}\})
Java正則表達式將是
"(\\{\\{[a-zA-Z0-9_-]*(?:=.*?)?\\}\\})"
要么
(\{\{[a-zA-Z0-9_-]*(?:=(?:(?!}}).)*)?\}\})
在此,我修改了.*?
在帶有(?:(?!}}).)*
的可選非捕獲組中(?:(?!}}).)*
。
(?!..)
稱為否定超前斷言。 這不會匹配任何字符,但會斷言匹配是否會發生在特定位置。 在這里(?!}}).
檢查是否要匹配的字符不是}}
。 也就是說,以下字符不會成為}}
的第一個大括號
如果是,則僅匹配相應的字符。
因此,這(?:(?!}}).)*
匹配任何字符,但不匹配}}
零次或多次。 ?
*
旁邊的*
使*
進行非貪心匹配。 請注意,這將與單個右花括號匹配。
碼:
String s = "bla bla {{foo}} bla bla {{bar=hehe}} bla bla";
Matcher m = Pattern.compile("\\{\\{[a-zA-Z0-9_-]*(?:=(?:(?!}}).)*)?\\}\\}").matcher(s);
while(m.find())
{
System.out.println(m.group());
}
輸出:
{{foo}}
{{bar=hehe}}
在Java中,通常所有正則表達式都可以正常工作,但是語法會發生變化。 使用雙斜杠('\\')而不是單斜杠。
嘗試這個 :
(\\{\\{[A-Za-z0-9_-]*(?:=.*)?\\}\\})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.