2013-02-22 44 views
1

我解析文本,如果我遇到了一個時間,我想分割字符串。這裏有一個例子:爲什麼分割會消除此C#代碼中的部分字符串?

At 12:30AM I got up. At 11:30PM I went to bed. 

我的代碼:

string time = @"[0-9]{2}:[0-9]{2}(A|P)M"; 
string test = "At 12:30AM I got up. At 11:30PM I went to bed."; 
string[] result = Regex.Split(test, time); 

foreach(string element in result) 
{ 
    Console.WriteLine(element); 
} 

我需要得到:

At 12:30AM 
I got up. At 11:30PM 
I went to bed. 

我得到什麼:

At 
A 
    I got up. At 
P 
    I went to bed. 

所有這一切剩下的時間是A或P.

回答

1

更改正則表達式來

([0-9]{2}:[0-9]{2}[AP]M) 

Thhe括號(A | P)被定義它作爲捕獲基團。您需要捕獲整個時間字符串。所以把括號放在整個事情上。

+0

不是'[A | P]'是否匹配'A','''和'P'? – Mehrdad 2013-02-22 05:48:55

+0

'|'是一個特殊字符。所以它不會被匹配,除非它帶有轉義字符。 – Aditi 2013-02-22 05:53:01

+0

不,@Mehrdad是對的:它應該是'[AP]' – 2013-02-22 05:53:22

1

因爲分割函數分隔符不包含在結果中。
如果你想讓它繼續作爲一個分割元件括在括號

string time = @"([0-9]{2}:[0-9]{2}(A|P)M)"; 

順便說一句,這是該「A」和「P」被留下,因爲他們括號中的原因。

+0

確實;如果您不想自己捕捉A或P,您想使用[AP]或(?:A | P)。 – Joe 2013-02-22 05:47:36

0

使用捕獲組。

string [email protected]".+?(?:\b\d{2}:\d{2}(?:AM|PM)|$)"; 
MatchCollection matches=Regex.Matches(input,regex); 
foreach(var match in matches) 
    Console.WriteLine(match.Groups[0]); 
+0

-1。你真的應該在發佈之前測試你的解決方案。正則表達式中的所有正斜槓應該是反斜槓,「MatchesCollection」類名稱應該是「MatchCollection」,您應該調用Matches方法而不是Match。而當你解決了這一切時,它仍然不會做OP所需要的。 – 2013-02-22 06:26:24

+0

你是對的修復,但最後的事情會做提問者想要的,或者至少是他寫的。他希望在模式之前包含這些詞,如他的例子所示。 – RoadBump 2013-02-27 07:51:25

+0

'不是。您將分號從第一行中分離出來,並且您已將「Matches()」的參數顛倒過來。這就是爲什麼你應該在發佈之前總是測試,即使你對答案的邏輯*完全有信心。但是你的正則表達式仍然是不正確的,正如你可以看到[** here **](http://ideone.com/zN47KG)。也許你正在考慮[** this **](http://ideone.com/shiPH2)? – 2013-02-27 20:31:16