从字符串中提取所有出现的特定字符
我的代码中有这样的内容。从字符串中提取所有出现的特定字符
mystring.Split(new[]{"/","*"}, StringSplitOptions.RemoveEmptyEntries);
不过,我真正想要的是mystring
分成两个阵列,一个持有上述分离项目,以及其他阵列守稳在它们出现在字符串中的顺序的分隔符。
我可以使用.IndexOf
继续搜索,直到我提取所有这些,但不知何故,我认为这将是多余的。有没有办法在.NET中做到这一点?如果可能,我想避免LINQ。
谢谢。
喜欢的东西:
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);
}
我实际上不得不添加'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;
}
解决方案罗布·史密斯建议也将工作,但我觉得这是最容易理解的。
感谢您的努力。但我其实并没有在寻找伯爵。 – 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);
}
伟大的工作。你的方法很好,但对于大量输入会很慢。 – 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++;
}
}
有你想要避免LINQ理由吗? – 2012-04-01 22:45:51
我认为split的结果是一个数组,其中包含它们出现的顺序。你能解释一下你想要进一步吗? – 2012-04-01 22:47:02
目标框架是.NET 2 – 2012-04-01 22:47:33