2011-07-01 83 views
0

任何人都可以幫助我解決這個問題嗎?用正則表達式解析標籤參數字符串

我的目標是從文本文件中獲取一些信息,向用戶顯示並請求值來替換該信息以生成新的輸出。所以我想使用正則表達式。

我的變量的格式爲:{@<num>[|<value>]}

下面是一些例子:

{@1}<br> 
{@2|label}<br> 
{@3|label|help}<br> 
{@4|label|help|something else}<br><br> 

因此,一些研究和試驗後,我想出了這個表達式:\{\@(\d{1,})(?:\|{1}(.+))*\}

它工作得很好,對大多數ocasions的,對像除了當此:

{@1} some text {@2|label} some more text {@3|label|help} 

在這種情況下變量2 & 3上的單次發生,而不是在2秒匹配分開的匹配...

我已經試圖使用lookahead命令爲表達式的尾部},但我沒有設法得到它。

我針對這個表達式使用到C#,應該進一步幫助任何人......

+2

你嘗試使用非貪婪的匹配'(。+?)'而不是'(。+)'嗎? – Howard

回答

0

正則表達式可以用來將像

\{\@(\d+)(?:\|([^|}]+))*\} 

這將防止閱讀過任何結束}

另一個可能的解決方案(具有稍微不同的行爲)將使用非貪婪匹配器(.+?)而不是貪婪版本(.+)

注意:我也刪除了{1}並將{1,}替換爲+,這與您的情況相同。

+0

也工作! 更精緻一點,因爲每個參數都已被分割。完美的解決方案,在我看來。謝謝! – Suriv

0

試試這個:

\{\@(\d+)(?:\|[^|}]+)*\} 

在C#:

MatchCollection matches = Regex.Matches(mystring, 
             @"\{\@(\d+)(?:\|[^|}]+)*\}"); 

它可以防止標籤和幫助從吃|}

match[0].Value => {@1} 
match[0].Groups[0].Value => {@1} 
match[0].Groups[1].Value => 1 
match[1].Value => {@2|label} 
match[1].Groups[0].Value => {@2|label} 
match[1].Groups[1].Value => 2 
match[2].Value => {@3|label|help} 
match[2].Groups[0].Value => {@3|label|help} 
match[2].Groups[1].Value => 3 
+0

沒有工作... 我只得到一個帶有這個變量的數字參數的組。但它修復了我的錯誤:) – Suriv

+0

@Suriv,我想我不明白你想要做什麼。當正確逃脫時,我的正則表達式與示例中的3個支撐標籤相匹配。它把數字放在第一組中。看到我更新的答案。 –

1

我喜歡這一個結果:

\{\@(\d+)(?:|\|(.+?))\} 

這將返回3組。第二組是數字(1,2,3),第三組是參數('label','label | help')。

我傾向於刪除*而選擇|以便捕獲最後一個分組中第一個管道之後的所有參數。

+0

它的工作原理!謝啦! 我得到2個組,1個名字,另一個與參數,然後我可以通過「|」分開。 – Suriv