2013-07-28 49 views
1

我需要一個大括號對恰好出現一次匹配的正則表達式:正則表達式:精確匹配一個發生

myString_{1-10}   -> match 
myString_{hello}_xyz -> match 
myString_{1-10}_{hello} -> do not match 

這裏是我的正則表達式:

(\{)[^}]*(\}) 

的問題是,我的正則表達式也匹配包含超過一個大括號對的字符串......我錯過了什麼?

+0

如何無與倫比的括號處理?例如,'myString _} {}'或'myString _ {} _ {' – SheetJS

+0

您是整個段落還是逐行? –

回答

2

您可以使用此:

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

說明:

^[^{}]* // Match 0 or more occurrences of character other than [{}] 
\{  // Match a `{` 
[^}]*  // Match 0 or more occurrences of character other than } 
\}  // Match a `}` 
[^{}]*$ // Match 0 or more occurrences of character other than [{}] 

你需要採取嵌套括號或大括號不匹配的照顧太

+2

@Downvoter。請注意評論。 –

+0

如果我只想要大括號之間的內容呢?我已經嘗試過^ [^ {}] *(?<= \\ {)[^}] *(?= \\})[^ {}] * $但它不起作用 – j3d

+0

只需移動內容在上面的正則表達式的'{'和'}'中捕獲組。你正在使用環視,這就是它失敗的原因。使用'^ [^ {}] * \ {{[^}] *)\} [^ {}] * $',並獲取捕獲的組1。 –

0

如果你正則表達式,荷蘭國際集團的整體變量包含所有三行,這就是你要找的東西:

(\{.*?\})_*(?:\{)* 

輸出將包含您正在尋找的內容。

這需要「s」標誌//點全部匹配。

+0

下劃線只是一個例子......任何角色都是可能的。 – j3d

0

您可以使用.NET這種模式與多模式:

(?<=^(?>[^{\n]*))\{[^}]*\}(?=[^{\n]*$)