2010-04-19 47 views
4

我有這個有點模板文本:正則表達式問題搶鑰匙

您好{#姓名#},

感謝各位出席在{#日期#}和 等等,我們的愛能再次見到你這裏 {#總統#}

所以我試圖讓{#...#}模板零件,並把它們放到一個數組。

但我的表達沒有工作:

\b(?<=\{\#)(.*)(?=\#\})\b 

結果成了這樣的事情該示例文本:

{#Something#} Hello {#Brand#} 

結果:

Something#} Hello {#Brand

+0

FYI:.NET具有非常類似的通過數據綁定表達式內置的東西。有關如何使用它的示例,請參閱此文章:http://haacked.com/archive/2009/01/04/fun-with-named-formats-string-parsing-and-edge-cases.aspx – chilltemp 2010-04-19 21:15:50

回答

4

只需添加?對於這樣的懶惰:

\b(?<=\{\#)(.*?)(?=\#\})\b 

*? means它會搜索儘可能少的重複

+0

它didn也不行。結果是空的。 – Tarik 2010-04-19 19:50:23

+1

@Braveyard - 對不起。一個不必要的括號再次檢查 – Hun1Ahpu 2010-04-19 20:06:06

3

這個怎麼樣? {#([^#]+)#}

這裏是在PowerShell腳本中使用的例子:

$input = "{#Something#} Hello {#Brand#}" 

$match = [regex]::Match($input, "{#([^#]+)#}") 

$i = 0 

while ($match.Success) { 
    $i++ 
    write-host ("Match {0}: '{1}'" -f $i, $match.Groups[1].Value) 
    $match = $match.NextMatch() 
} 

而這正是它輸出:

Match 1: 'Something' 
Match 2: 'Brand' 
+0

它沒有工作。結果是{{''。我正在使用Expresso來評估結果。 – Tarik 2010-04-19 19:49:39

+0

我使用了RegexBuddy - 在我的機器上工作!我將用PowerShell更新我的答案以證明這一點。 – 2010-04-19 20:06:33

+0

我認爲這應該是區別正則表達式引擎?因爲'{'應該用'\\'寫成,以表示這是一個文字而不是符號。 – Tarik 2010-04-19 20:26:40