2012-04-01 148 views
3

我的代碼中有這樣的內容。從字符串中提取所有出現的特定字符

mystring.Split(new[]{"/","*"}, StringSplitOptions.RemoveEmptyEntries); 

不過,我真正想要的是mystring分成兩個陣列,一個持有上述分離項目,以及其他陣列守穩在它們出現在字符串中的順序的分隔符。

我可以使用.IndexOf繼續搜索,直到我提取所有這些,但不知何故,我認爲這將是多餘的。有沒有辦法在.NET中做到這一點?如果可能,我想避免LINQ。

謝謝。

+0

有你想要避免LINQ理由嗎? – 2012-04-01 22:45:51

+0

我認爲split的結果是一個數組,其中包含它們出現的順序。你能解釋一下你想要進一步嗎? – 2012-04-01 22:47:02

+0

目標框架是.NET 2 – 2012-04-01 22:47:33

回答

4

喜歡的東西:

var separators = new char[] { '/', '*' }; 
var words = new List<string>(); 
var delimiters = new List<string>(); 
var idx = source.IndexOfAny(separators); 
var prevIdx = 0; 
while (idx > -1) 
{ 
    if (idx - prevIdx > 0) 
     words.Add(source.Substring(prevIdx, idx - prevIdx)); 

    prevIdx = idx + 1; 
    delimiters.Add(source.Substring(idx, 1)); 
    idx = source.IndexOfAny(separators, idx + 1); 
} 
+0

我實際上不得不添加'words.Add(VT.Substring(prevIdx));'謝謝。 – 2012-04-03 06:28:18

0

你可以考慮使用命名組的正則表達式。嘗試一個嵌套的命名組。外部包括捕獲分隔符和內部捕獲內容。

0

既然你在運行.NET 2.0,我會說使用IndexOf是最直接的方式來解決這個問題之一:

public static int CountOccurences(string input, string pattern) 
{ 
    int count = 0; 
    int i = 0; 

    while (i = input.IndexOf(pattern, i) != -1) 
     count++; 
    return count; 
} 

解決方案羅布·史密斯建議也將工作,但我覺得這是最容易理解的。

+0

感謝您的努力。但我其實並沒有在尋找伯爵。 – 2012-04-03 06:29:35

2

如果我正確理解提問者,他希望實際分離的項目以及分隔符。

我認爲下面的代碼將工作:

 List<string> SeparatedItems = new List<string>(); 
     List<string> Delimiters = new List<string>(); 

     string sTestString = "mytest/string*isthis**and not/this"; 

     string sSeparatedItemString = String.Empty; 
     foreach(char c in sTestString) { 

      if(c == '/' || c == '*') { 

       Delimiters.Add(c.ToString()); 
       if(sSeparatedItemString != String.Empty) { 

        SeparatedItems.Add(sSeparatedItemString); 
        sSeparatedItemString = String.Empty; 
       } 
      } 
      else { 

       sSeparatedItemString += c.ToString();  
      } 

     } 

     if(sSeparatedItemString != String.Empty) { 

      SeparatedItems.Add(sSeparatedItemString); 
     } 
+0

偉大的工作。你的方法很好,但對於大量輸入會很慢。 – 2012-04-03 06:44:26

1

試試這個:

var items = new List<string>(); 
var delimiters = new List<string>(); 
items.AddRange(Regex.Split(text, @"(?<=/)|(?=/)|(?<=\*)|(?=\*)")); 

for (int i = 0; i < items.Count;) 
{ 
    string item = items[i]; 
    if (item == "*" || item == "/") 
    { 
     delimiters.Add(item); 
     items.RemoveAt(i); 
    } 
    else if (item == "") 
    { 
     items.RemoveAt(i); 
    } 
    else 
    { 
     i++; 
    } 
} 
相關問題