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

C# 从字符串中提取所有出现的特定字符,c#,.net,string,search,C#,.net,String,Search,我的代码中有类似的东西 mystring.Split(new[]{"/","*"}, StringSplitOptions.RemoveEmptyEntries); 然而,我实际想要的是将mystring分成两个数组,一个数组保存上面分离的项,另一个数组保存上面分隔符在字符串中的显示顺序 我可以使用.IndexOf继续搜索,直到我提取出所有的代码,但不知何故,我认为这是多余的。在.NET中有这样做的方法吗?如果可能的话,我想避开林克 谢谢。 可以考虑使用命名组的正则表达式。尝试嵌套命名组。外部

我的代码中有类似的东西

mystring.Split(new[]{"/","*"}, StringSplitOptions.RemoveEmptyEntries);
然而,我实际想要的是将
mystring
分成两个数组,一个数组保存上面分离的项,另一个数组保存上面分隔符在字符串中的显示顺序

我可以使用
.IndexOf
继续搜索,直到我提取出所有的代码,但不知何故,我认为这是多余的。在.NET中有这样做的方法吗?如果可能的话,我想避开林克


谢谢。

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

由于您运行的是.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建议的解决方案也会起作用,但我发现这是最容易理解的解决方案。

如果我正确理解提问者,他需要实际的分隔项以及分隔符

我认为以下代码将起作用:

        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);
        }
List SeparatedItems=new List();
列表分隔符=新列表();
string sTestString=“mytest/string*是此**而不是/此”;
string sSeparatedItemString=string.Empty;
foreach(字符串中的字符c){
如果(c=='/'| | c=='*')){
Delimiters.Add(c.ToString());
if(sSeparatedItemString!=String.Empty){
separatedems.Add(sSeparatedItemString);
sSeparatedItemString=String.Empty;
}
}
否则{
sSeparatedItemString+=c.ToString();
}   
}
if(sSeparatedItemString!=String.Empty){
separatedems.Add(sSeparatedItemString);
}
试试这个:

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++;
    }
}
var items=newlist();
var delimiters=新列表();
items.AddRange(Regex.Split(text,@)(?类似于:

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);
}
var分隔符=新字符[]{'/','*};
var words=新列表();
var delimiters=新列表();
var idx=源索引(分隔符);
var-prevIdx=0;
而(idx>-1)
{
如果(idx-prevIdx>0)
Add(source.Substring(prevIdx,idx-prevIdx));
prevIdx=idx+1;
delimiters.Add(source.Substring(idx,1));
idx=源索引(分离器,idx+1);
}

您想避免使用LINQ有什么原因吗?我认为拆分的结果是一个数组,其中的项按其出现的顺序排列。您能解释一下您想要进一步的结果吗?我想从拆分操作中得到两个结果(如果可能的话)…或者以其他方式获得分离的项和分隔符。(不会出现在分离项数组中)。一些具有预期输出的示例输入将有助于澄清您的问题。实际上,我必须添加
单词。添加(VT.Substring(prevIdx));
谢谢。感谢您的努力。但我实际上并不是在寻找计数。干得好。您的方法很好,但对于大量输入来说,速度会很慢。