2012-12-21 104 views
3

我有一個字符串,如下所示。用兩個標準分割字符串

string sample =「class0 .calss1 .class2 .class3.class4 .class5 class6 .class7」;

我需要從此示例字符串中創建WORDS列表。

一個字是與一個週期開始和結尾的字符串:

  1. 的空間或
  2. 另一個週期或字符串的

:該關鍵點在於 - 分裂基於兩個標準 - 一段時間和一個空白區域

我有以下程序。它工作正常。但是,有沒有使用LINQRegular Expressions更簡單/更高效/簡潔的方法?

CODE

 List<string> wordsCollection = new List<string>(); 
     string sample = " class0 .calss1 .class2 .class3.class4 .class5 class6 .class7"; 

     string word = null; 

     int stringLength = sample.Length; 
     int currentCount = 0; 

     if (stringLength > 0) 
     { 
      foreach (Char c in sample) 
      { 

       currentCount++; 
       if (String.IsNullOrEmpty(word)) 
       { 
        if (c == '.') 
        { 
         word = Convert.ToString(c); 
        } 
       } 
       else 
       { 

        if (c == ' ') 
        { 
         //End Criteria Reached 
         word = word + Convert.ToString(c); 
         wordsCollection.Add(word); 
         word = String.Empty; 
        } 
        else if (c == '.') 
        { 
         //End Criteria Reached 
         wordsCollection.Add(word); 
         word = Convert.ToString(c); 
        } 
        else 
        { 
         word = word + Convert.ToString(c); 
         if (stringLength == currentCount) 
         { 
          wordsCollection.Add(word); 
         } 
        } 
       } 

      } 
     } 

RESULT

 foreach (string wordItem in wordsCollection) 
     { 
      Console.WriteLine(wordItem); 

     } 

enter image description here

參考:

  1. Splitting up a string, based on predicate
  2. Is there a better way to get sub-sequences where each item matches a predicate?
  3. Linq based generic alternate to Predicate<T>?
+0

http://msdn.microsoft.com/en-us/library/vstudio/b873y76a.aspx – VladL

+0

查看[代碼審查] (http://codereview.stackexchange.com) – Default

+0

@VladL拆分基於兩個標準 - 一個句點和一個空格。如何使用String.Split來完成? – Lijo

回答

5

您可以用正則表達式做到這一點。

代碼

Regex regex = new Regex(@"\.[^ .]+"); 
var matches = regex.Matches(sample); 
string[] result = matches.Cast<Match>().Select(x => x.Value).ToArray(); 

看到它聯機工作:ideone

結果

.calss1 
.class2 
.class3 
.class4 
.class5 
.class7 

說明正則表達式

 
\.  Match a dot 
[^. ]+ Negative character class - anything apart from space or dot (at least one) 

相關

+2

+1我通常不喜歡用正則表達式來分割字符串,但這是最好的方法。 – juharr

+0

謝謝。你能否通過「儘可能少」來解釋你的意思 – Lijo

+1

@Lijo:默認情況下正則表達式是貪婪的。 '?'修飾符使'*'[懶惰](http://www.regular-expressions.info/repeat.html#lazy)。 –

0

你需要保持。和空間?

如果不是你可以使用:

sample.split(new char[]{" ", "."}).ToList(); 

這會給你一個字符串列表。

+0

此代碼不能編譯。 – Lijo

0
string sample = " class0 .calss1 .class2 .class3.class4 .class5 class6 .class7"; 
sample = Regex.Replace(sample, " ", String.Empty); 
string[] arr = sample.Split(new char[] { '.' }); 
+0

難道你沒有看到class0進入結果嗎? – Lijo

1
string sample = " class0 .calss1 .class2 .class3.class4 .class5 class6 .class7"; 

string[] words = sample.Split(new char[] {'.'}).Skip(1).Select(x=> 
      "." + x.Split(new char[] {' '})[0].Trim()).ToArray(); 

編輯無緣名單的部分:

List<string> words = sample.Split(new char[] {'.'}).Skip(1).Select(x=> 
      "." + x.Split(new char[] {' '})[0].Trim()).ToList();