2011-08-09 75 views
0

我用下面的測試,試圖找出這個表達式: http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx組在C#中的正則表達式

我輸入: 123stringA 456 stringB

我的模式: ( [0-9] {3})(。*?)

該模式最終會成爲日期,但對於這個問題,我會保持簡單並使用我的簡化輸入。

我理解這個模式的方式,它的「給我3號[0-9] {3},後跟任意數量的任何類型的字符。*,直到它到達下一場比賽?

什麼我想/希望進行這項試驗的是每場比賽2與2組:
1場
     集團1 - 123
     集團2 - stringA
MATCH2
     集團1 - 456
     集團2 - stringB

出於某種原因,在鏈接我提供的測試看,有一個小組第二,但它的到來空白。我之前用PHP做過這件事,它看起來像我描述的那樣工作,但在C#中我看到了不同的結果。任何幫助,你可以提供將不勝感激。

我也應該注意,這可能會擴大多行...

  • 編輯*

這裏的實際輸入: 2011-08-09 09:25:57069 [9] Orchard.Environment.Extensions.ExtensionManager - 錯誤加載擴展2011-08-09 09:25:57,493 [8] Orchard.Environment.Extensions.ExtensionManager

對於匹配1我想獲得: 2011-08- 09 09:25:57和 ,069 [9] Orchard.Environment.Extensions.ExtensionManager - 錯誤加載擴展

和用於匹配2: 2011-08-09九點25分57秒和 ,493 [8] Orchard.Environment.Extensions。 ExtensionManager

我試圖找到解析錯誤日誌文件,該文件是在一個巨大的文本文件,並保持錯誤發生的日期和它

+1

如果您在Visual Studio測試什麼呢? – BoltClock

+1

@tjans您應該接受以前問題的答案。 (點擊對你最有幫助的對號旁邊的複選標記。) – dlras2

回答

2

走到一起的細節的第一場小組賽3的好方法數字,第二組匹配字符串的其餘部分,因爲模式中沒有任何內容阻止.*?不匹配剩餘字符串的r。

更正:第二組匹配空字符串,因爲模式中沒有任何內容阻止.*?不匹配空字符串。

+0

啊,所以我需要提供某種分隔符,它會在下一場比賽開始之前出現... – tjans

+0

'*?'使它不成立-greedy將不匹配字符串的其餘部分_fully_ – Mrchief

+0

@Mrchief:哎呀!你是對的。 – MRAB

1

.*意味着匹配任何零次或多次。 ?意思是找到最少的次數,所以它選擇零匹配作爲最小值。

嘗試這種模式,([0-9]{3})([a-zA-Z]*)

+0

'*?'使它非貪婪。 – Mrchief

+0

@Mrchief,好吧,我說的不是嗎?從MSDN'*? 匹配以前的元素零次或多次,但儘可能少的次數。' – Kratz

+0

是的,但你的模式是不夠的,因爲OP需要任何字符,而不僅僅是字母。 – Mrchief

0

不知道爲什麼工具給你,但你可以切換到在.net中工作這種替代模式

([0-9]{3})([^0-9]*) 

http://regexhero.net/tester/?id=155b8e2b-b851-46b9-8a84-b82f8d6963a1

說明:

在你之前的模式中,nongreedy v ersion匹配0個字符。

在新的[^0-9]表示匹配範圍以外的任何字符0-9(注意否定^說明符)。

更新:鑑於實際的輸入字符串(在評論),模式變爲(其猜測假設OP想做什麼:

,([0-9]{3})([^\n]*) 

http://regexhero.net/tester/?id=155b8e2b-b851-46b9-8a84-b82f8d6963a1

+0

有趣的是,這確實有效......我不知道爲什麼......你能解釋一下嗎? – tjans

+0

我試圖將它應用於:2011-08-09 09:25:57,069 [9] Orchard.Environment。Extensions.ExtensionManager - 加載擴展出錯 2011-08-09 09:25:57,493 [8] Orchard.Environment.Extensions.ExtensionManager - 加載擴展出錯 – tjans

+0

更新了我的答案。 – Mrchief

0

根據您的評論,這就是你想要匹配的

2011-08-09 09:25:57,069 [9] Orchard.Environment.Extensio ns.ExtensionManager - 錯誤加載 延伸2011-08-09 09:25:57493 [8] Orchard.Environment.Extensions.ExtensionManager - 錯誤加載 延伸

這個表達式將在第一捕獲日期匹配組,其餘的直到下一個日期或直到第二個捕獲組中的字符串結束。

(\d{4}(?:-\d{2}){2})(.*?)(?=(?:\d{4}(?:-\d{2}){2}|$)) 

看到它here on Regexr

+0

感謝您成爲耐心的人......我更新了原來的問題。我會給這一個... – tjans

+0

這一個似乎並沒有工作......當我運行該模式時,我得到0匹配... – tjans

+0

它的工作Regexr,你如何使用它?有一件事我不介意,你應該用c#編寫你的正則表達式:@「(\ d {4}(?: - \ d {2}){2})(。*?)(?=(?: \ d {4} - {2} | $))」(\ d {2}?)。沒有@你需要雙重逃脫。 – stema