我正在根据所有标点符号和空格字符拆分字符串。我没有构建复杂的 (?) 正则表达式来匹配 C# 认为的“标点符号”和“空白”字符,而是使用
char.IsPunctuation
和 char.IsWhiteSpace
方法从字符串中获取标点符号/空白字符.
基本上,这就是我正在做的事情 - 构建标点符号和空白字符的数组,稍后我用它来分割字符串。
return text.Where(c => char.IsPunctuation(c) || char.IsWhiteSpace(c))
.Distinct()
.ToArray();
我最初这样做是因为我找不到任何地方有 C# 认为标点符号或空格的静态字符列表/数组。在 char.IsPunctuation
String.Split
,而不是使用
StringBuilder
来处理无穷无尽的字符列表,并在拆分之前使用 LINQ 确定它们(这实际上效率很低)。例如:public static string[] SplitWhiteSpacesAndPunctuations(string text, StringSplitOptions options = StringSplitOptions.None)
{
List<string> list = new(Math.Max(text.Length/10, 4));
StringBuilder sb = new(10);
foreach (char c in text)
{
if (char.IsWhiteSpace(c) || char.IsPunctuation(c))
{
AddStringAndClearStringBuilder();
}
else
{
sb.Append(c);
}
}
AddStringAndClearStringBuilder();
return list.ToArray();
void AddStringAndClearStringBuilder()
{
if (sb.Length == 0 && options == StringSplitOptions.RemoveEmptyEntries) return;
list.Add(sb.ToString());
sb = new StringBuilder();
}
}
演示:https://dotnetfiddle.net/3eLI9d