2010-06-30 88 views
4

如果我有一個字符串,如「ABCDEF {123} GHI {456} KL」,我想創建一個正則表達式,這將使我的所有部件分解如下:正則表達式來分割包含文本標記

abcdef 
{123} 
ghi 
{456} 
kl 

我使用這個代碼,但想不通的表達應該是什麼:

System.Text.RegularExpressions.Regex rex = new System.Text.RegularExpressions.Regex("expression"); 
foreach (System.Text.RegularExpressions.Match match in rex.Matches(sText).OfType<System.Text.RegularExpressions.Match>()) 
{ 
    ... 
} 
+0

總是有五個部分嗎? – 2010-06-30 20:34:39

+0

對於如何處理額外無與倫比的大括號以及如何處理嵌套大括號,您能否更精確一點? – 2010-06-30 21:12:06

回答

3

你應該使用using語句,而不是在全每次寫出的命名空間。乍一看,你的代碼看起來相當複雜,但是當你刪除所有的命名空間時,它變得非常簡單。也不需要OfType

正則表達式應該儘可能地匹配,這不是一個開放的大括號[^{]*或者一個開放的大括號,一些文本然後一個大括號{[^}]*}。這正則表達式是:

{[^}]*}|[^{]* 

試試這個代碼:

string text = "abcdef{123}ghi{456}kl"; 
Regex regex = new Regex("{[^}]*}|[^{]*"); 
foreach (Match match in regex.Matches(text)) 
{ 
    Console.WriteLine(match.Value); 
} 

輸出:

 
abcdef 
{123} 
ghi 
{456} 
kl 

注:這個正則表達式不驗證字符串是正確的格式它假定它是良構的。

稍微簡單的方法是使用分割而不是匹配,並且包括在正則表達式捕獲組,使得所述分離器還包括在輸出:

string text = "abcdef{123}ghi{456}kl"; 
Regex regex = new Regex("({[^}]*})"); 
foreach (string part in regex.Split(text)) 
{ 
    Console.WriteLine(part); 
} 

這種情況的輸出是相同的以上。

+0

這是一個好的開始。我發現了一些我需要考慮的邊緣情況。例如,在「a {1} b {2} c {d {3} d」中應返回a,{1},b {2},c {d,{3},d,但返回a,{1} ,b,{2},c,{d {3},d – Jeremy 2010-06-30 20:56:49

+0

在這種情況下,使用Split解決方案,但將正則表達式更改爲'({[^ {}] *})''。 – 2010-07-01 03:42:51

0
([a-z]+)({\d+})([a-z]+)({\d+})([a-z]+) 

會工作,但只有在字符串中總是有五個部分的情況下才有效。可以有更少/超過五個?

+0

可能有任何數字 – Jeremy 2010-06-30 21:24:24