从字符串中提取所有出现的特定字符

问题描述:

我的代码中有这样的内容。从字符串中提取所有出现的特定字符

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

喜欢的东西:

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

你可以考虑使用命名组的正则表达式。尝试一个嵌套的命名组。外部包括捕获分隔符和内部捕获内容。

既然你在运行.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

如果我正确理解提问者,他希望实际分离的项目以及分隔符。

我认为下面的代码将工作:

 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

试试这个:

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++; 
    } 
}