2010-01-29 53 views
2

所以我試圖匹配一個正則表達式,我在這方面相當新。我使用了一個驗證器,它在我粘貼代碼時起作用,但當它被放置在.NET2.0 C#頁面的代碼隱藏時,它不起作用。正則表達式不能在.NET中工作

有問題的代碼應該能夠在單個分號上分割,但不能在雙分號上分割。但是,當我使用字符串

「entry; entry2; entry3; entry4;」

我得到一個無意義的數組,其中包含空值,前一個條目的最後一個字母和分號自己。在線JavaScript驗證器正確分割它。請幫忙!

我的正則表達式:

((;;|[^;])+) 
+0

你可以刪除javascript標籤,因爲這是一個.NET問題... – t0mm13b 2010-01-29 15:58:53

+0

http://www.nregex.com/nregex/default.aspx是有用的fo r在線輕鬆檢查正則表達式,在桌面上的http://sourceforge.net/projects/regulator/也是如此。第二個對於學習它們也非常有用。 – 2010-01-29 16:00:53

+0

我曾使用JavaScript驗證器來驗證我的原始正則表達式。 C#和JavaScript正則表達式之間的區別顯然是我的問題,因此我爲什麼標記它的JavaScript。 – 2010-01-29 16:04:09

回答

5

拆分以下的正則表達式:

(?<!;);(?!;) 

這意味着匹配分號既不是之前也不由另一個分號成功。

例如,該代碼

var input = "entry;entry2;entry3;entry4;"; 
foreach (var s in Regex.Split(input, @"(?<!;);(?!;)")) 
    Console.WriteLine("[{0}]", s); 

產生以下輸出:

[entry] 
[entry2] 
[entry3] 
[entry4] 
[]

最終空字段是對輸入的端部的分號的結果。

如果分號是終止在每個領域,而不是連續的場之間的分隔符的結束,然後使用Regex.Matches代替

foreach (Match m in Regex.Matches(input, @"(.+?)(?<!;);(?!;)")) 
    Console.WriteLine("[{0}]", m.Groups[1].Value); 

得到

[entry] 
[entry2] 
[entry3] 
[entry4]
+0

謝謝!太糟糕了,我和我的原創歌曲很遙遠。這一個留下了一個空的條目,關於如何擺脫那個的任何想法? – 2010-01-29 15:58:14

+0

@C Bauer查看更新的答案。 – 2010-01-29 16:25:17

1

爲什麼不使用String.Split在分號上?

 
string sInput = "Entry1;entry2;entry3;entry4"; 
string[] sEntries = sInput.Split(';'); 
// Do what you have to do with the entries in the array... 

希望這有助於 最好的問候, 湯姆。

+0

「但不是雙分號」要求使得這種*非常醜。 – 2010-01-29 15:56:37

+0

問題是他不想在雙分號(;;)上分裂,因此String.Split()對他來說是不夠的。 – 2010-01-29 15:56:50

+0

對不起,湯姆,這是行不通的,因爲它會分裂所有分號,我需要它跳過雙分號,如原始問題所述。 – 2010-01-29 15:57:25

1

由於tommieb75寫道,你可以使用String.SplitStringSplitOptions枚舉這樣可以控制新創建的分裂陣列的輸出

string input = "entry1;;entry2;;;entry3;entry4;;"; 
char[] charSeparators = new char[] {';'}; 
// Split a string delimited by characters and return all non-empty elements. 
result = input.Split(charSeparators, StringSplitOptions.RemoveEmptyEntries); 

結果將只包含4個元素是這樣的:

<entry1><entry2><entry3><entry4> 
+0

請閱讀原始問題,看看爲什麼這不起作用。在我問這個問題之前,我知道只有正則表達式纔有用。 – 2010-02-01 14:39:23

+0

所以你想將a; b; c ;; d分割爲[a] [b] [c ;; d]或[a] [b] [c] [d]。如果是第二個,你仍然可以使用Split,但如果它是第一個,我將刪除我的答案。 – nemke 2010-02-01 18:35:12