2011-06-01 126 views
2

我需要一個正則表達式,可以使用它檢查字符串並在.NET中執行RegEx.Split()時返回特定項目。我一直試圖自己做這件事,但我永遠無法得到我需要的東西,而結果從來沒有任何意義。顯然,我沒有很好的寫正則表達式的手段。在.NET中使用正則表達式拆分字符串

因此,這裏的字符串...

"%date - %-5level - [%thread] - %logger - %message - %exception%newline" 

我基本上是想返回一個數組,如下所示:

"date" 
"-5level" 
"thread" 
"logger" 
"message" 
"exception" 
"newline" 

下面的代碼是接近,但並不完全。

Regex exp = new Regex(@"\W+"); 
string[] s = exp.Split(@"%date - %-5level - [%thread] - %logger - %message - %exception%newline"); 

我得到如下:

"" 
"date" 
"5level" 
"thread" 
"logger" 
"message" 
"exception" 
"newline" 

出於某種原因,我有一個空字符串作爲第一指標,以及第三索引缺少「 - 」。我假設,因爲它不是一個「單詞」的一部分。

的 「 - 」 一邊一段時間,然後我想分裂 「5level」 到數組:

"5" 
"level" 

我嘗試了這一點:

Regex exp2 = new Regex(@"(\d+)([a-zA-Z]+)"); 
string[] s2 = exp2.Split("5level"); 

但是,它返回2個索引除了我想要的拆分項目之外還有空字符串:

"" 
"5" 
"level" 
"" 

我對如何格式化表達式給我什麼我需要。任何幫助,將不勝感激。

+1

你會很有禮貌地學習如何正確使用降價,以便其他人不必重新格式化你的帖子。看看下面的內容:http://stackoverflow.com/editing-help – spender 2011-06-01 19:53:45

+2

感謝您的建議。這是我第一次發佈,我將在未來的帖子中記住這一點。 – Scott 2011-06-01 20:21:43

+0

好東西...;) – spender 2011-06-01 23:52:00

回答

4

而不是使用Regex.Split的,它可能更容易滿足你所需要的代幣:

MatchCollection matches = Regex.Matches(s, @"%([\w\-]+)"); 
string[] words = matches.Cast<Match>().Select(m => m.Groups[1].Value).ToArray(); 

拆分可能會增加空的比賽中,當你親眼目睹了,將不得不被過濾掉。

+0

順便說一句 - 對'\ W +'進行拆分幾乎是匹配'\ w +'的反模式。哦,在這種情況下,正則表達式在沒有'%'符號的情況下幾乎完全相同 - 您可能需要它,具體取決於未指定的輸入格式。 – Kobi 2011-06-01 20:04:02

+0

非常感謝。這正是我所期待的。我研究了你的表達以理解它的邏輯。感謝您使用MatchCollection的建議。我甚至沒有意識到這種集合類型。 – Scott 2011-06-01 20:26:17

+0

@Scott - 沒問題。樂於幫忙,並歡迎堆棧溢出! – Kobi 2011-06-01 20:28:36

相關問題