【发布时间】:2019-12-03 21:52:49
【问题描述】:
例如,我有一个字符串,我只希望字符“
【问题讨论】:
-
是的。这是可能的。
-
确定;您可以继续使用 IndexOf 来查找它是否存在 10 次,或者您可以编写一个正则表达式,或者您可以“拆分”它,或者...
例如,我有一个字符串,我只希望字符“
【问题讨论】:
Regex.Matches 可用于统计字符串中某个模式出现的次数。
它还引用每个出现的位置,Capture.Index 属性。
您可以阅读 Nth 出现的索引并在那里剪切您的字符串:
(RegexOptions 是为了防止模式不同。根据需要进行修改。)
int cutAtOccurrence = 10;
string input = "one<two<three<four<five<six<seven<eight<nine<ten<eleven<twelve<thirteen<fourteen<fifteen";
var regx = Regex.Matches(input, "<", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
if (regx.Count >= cutAtOccurrence) {
input = input.Substring(0, regx[cutAtOccurrence - 1].Index);
}
input 现在是:
one<two<three<four<five<six<seven<eight<nine<ten
如果您需要多次使用此过程,最好构建一个返回StringBuilder 的方法。
【讨论】:
您可以使用TakeWhile 来达到您的目的,给定字符串s,您的角色< 为c,您的计数10 为count,以下函数将解决您的问题:
public static string foo(string s, char c, int count)
{
var i = 0;
return string.Concat(s.TakeWhile(x => (x == c ? i++ : i) < count));
}
【讨论】:
手动解决方案可能如下所示:
class Program
{
static void Main(string[] args)
{
int maxNum = 10;
string initialString = "a<b<c<d<e<f<g<h<i<j<k<l<m<n<o<p<q<r<s<t<u<v<w<x<y<z";
string[] splitString = initialString.Split('<');
string result = "";
Console.WriteLine(splitString.Length);
if (splitString.Length > maxNum)
{
for (int i = 0; i < maxNum; i++) {
result += splitString[i];
result += "<";
}
}
else
{
result = initialString;
}
Console.WriteLine(result);
Console.ReadKey();
}
}
顺便说一句,尝试使用Regex可能会更好(以防您将来可能有其他替换规则,或者需要进行更改等)。但是,鉴于您的问题,类似的方法也可以。
【讨论】: