在 C# 中,我想 Trim() 所有可能类型的空白字符(由 .IsWhitespace 定义)的字符串的两端,加上修剪字符串的开头以同时从 char[ 中的自定义列表中删除任何字符] 数组,出现在常规字母数字字符之前。所以字符串应该结束,第一个字符不是任何空格,也不是我的自定义列表中的字符之一。 (但是,在第一个字符之后,字符串当然可能包含空格或列表中的字符。)
我只想遍历字符串一次来完成所有这些,因为要修剪的字符串列表很大。
以下内容不起作用(请参阅代码片段下方的更多评论)。
static class TrimmerExtension
{
private const string _prefixCharsToTrimAsString = "~`$|-_";
private static readonly char[] _prefixCharsToTrim;
// static ctor
static TrimmerExtension()
{
_prefixCharsToTrim = _prefixCharsToTrimAsString.ToCharArray();
}
public static string TrimWhitespaceAndPrefixes(this string s)
{
return s.Trim().TrimStart(_prefixCharsToTrim).TrimStart();
}
}
以上都不行,因为:
它多次调用不同版本的 Trim,从而多次遍历字符串。 (所以上面是低效的);
如果其他要修剪的字符之间有空白字符,则不会从头开始完全修剪所有空格和特殊字符;例如,如果字符串包含“$ ~ Something”,扩展方法将返回“~ Something”,但仍需要删除前两个字符。 (所以上面的代码是不正确的。)
C# 或 .NET 是否提供了执行此操作的有效方法(在性能和源代码简单性方面)?或者,是否有一个类或库定义了 Trim() 函数将从字符串中删除的所有可能空白字符的常量字符(或字符串)数组,因此我可以将它添加到我的特殊前缀字符列表中删除?
如果此特定问题已得到解答,请发布问题和答案的链接。
谢谢。
为什么不用手做呢?
public static string MySpecialTrim(string str, char[] trimChars)
{
for (var i = 0; i < str.Length; ++i)
{
char ch = str[i];
if (!char.IsWhiteSpace(ch) && !trimChars.Contains(ch))
return str.Substring(i);
}
return str;
}
这样你就可以控制哪些字符被修剪了。
TrimStart()
.string input = "$%Hello World";
char[] trimChars = {' ', '$', '%'};
string output = input.TrimStart(trimChars);
Console.WriteLine(output); // Output: "Hello World"