簡體   English   中英

正則表達式-匹配不包含字符串的模式

[英]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.

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