2016-08-01 68 views
1

我有這個字符串模式,我試圖匹配。它可以包含一些用兩個花括號括起來的單詞。這些花括號必須格式良好,不能嵌套。不必要的長正則表達式

例如:

I have this {{example}} which is right 
Here {{is}} another {{example}} which is right 
{{ This {{ example }} is wrong }} 
{{ This }}example {{ is also { wrong }} 

我構建這個正則表達式,這似乎工作,但它是很長的,我認爲它可以簡化。

"^([^{}]*\\{\\{([^{}]*)\\}\\}[^{}]*)+$"

有沒有什麼辦法可以簡化這個?

+0

,你在尋找什麼簡化?刪除字符類中的''''*和*使所有惰性量詞貪婪,因爲它們在此處的作用相同(請參閱http://ideone.com/kJeHM6)。 –

+0

@WiktorStribiżew哎呀,我解決了這個問題。我的意思是除此之外的簡化 – Ogen

+0

我更新了上面的註釋,您也可以將所有'*?'更改爲'*'。 –

回答

2

做一個否定匹配會更容易。也就是說,尋找什麼是不允許的:

\\{\\{[^}]*\\{ 

並使用Matcher.find()。使用regex against XML is problematic來嘗試使用正匹配來做到這一點很困難。

如果你想抓住的括號中的內容做就夠

\\{\\{(\\w+\\)}\\} 
+0

用'[{] [{] \\ w + [}] [}]保存在反斜槓上' – Harald

+1

@Harald用方括號保存\\;) – JimmyJames

1

目前尚不清楚你的意思是什麼「做出的模式更簡單」。已知好的圖案很長。較短的正則表達式很少是精確的

在你的情況,你不應該使用的字符類中{}符號逃逸(你固定的,我的第一個評論後),你不需要在表達式內懶惰量詞除非你是使用捕獲的值進行一些進一步處理。但是,你似乎沒有使用它們,所以使用:

"^([^{}]*\\{\\{([^{}]*)\\}\\}[^{}]*)+$" 

Java demo

String s = "I have this {{example}} which is right"; 
Pattern pattern = Pattern.compile("^([^{}]*\\{\\{([^{}]*)\\}\\}[^{}]*)+$"); 
Matcher matcher = pattern.matcher(s); 
if (matcher.matches()){ 
    System.out.println(matcher.group(0)); 
}