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

时间:2012-04-01 22:42:27

标签: c# .net string search

我的代码中有类似的内容。

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

然而,我真正想要的是将mystring分成两个数组,一个包含上面的分隔项,另一个数组按照它们在字符串中出现的顺序保持上面的分隔符。

我可以使用.IndexOf继续搜索,直到我提取所有这些,但不知何故,我认为这将是多余的。有没有办法在.NET中执行此操作?如果可能,我想避免使用LINQ。

感谢。

5 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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);
        }

答案 2 :(得分: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++;
    }
}

答案 3 :(得分:0)

您可以考虑使用命名组的Regex表达式。尝试嵌套的命名组。外部包括捕获分隔符和内部仅捕获内容。

答案 4 :(得分: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;
}

Rob Smyth建议的解决方案也可行,但我发现这是最简单,最容易理解的解决方案。