如何在某些字符之间保留单个空格或制表符,同时将其从其他字符中删除
本文关键字:字符 制表符 其他 删除 之间 空格 单个 保留 | 更新日期: 2023-09-27 18:00:15
我需要一个C#解决方案来清理一些名称,删除任何空格或制表符、前导或尾随以及字符之间的特定字母。如果单词的最后一个字母和第一个字母的大小写相同,则去掉空格。否则只留下一个空格。
示例:
之前:Rob ert Pla nt
之后:Robert Plant
或
之前:Ro bert Plant
之后:Robert Plant
注意,由于o和b是相同的情况,所以删除了空格,但由于p是大写,t是小写,所以保留了t和p。
到目前为止,我能做的最好的事情是:
public static string RemoveMultiSpace(string input)
{
return Regex.Replace(input, @"'s+", " ");
}
static void Main(string[] args)
{
Console.Write(RemoveMultiSpace("Ro bert Plant"));
Console.ReadKey();
}
这是输出:Ro bert Plant
,但我需要一个类似于:Robert Plant
您可以使用此正则表达式来检测两边都有小写字母的空格:
(?<=[a-zA-Z])'s+(?=[a-z])|'s(?='s)
它还删除了零件's(?='s)
中的重复空格。
在代码中,它看起来像:
public static string RemoveMultiSpace(string input)
{
return Regex.Replace(input, @"(?<=[a-zA-Z])'s+(?=[a-z])|'s(?='s)", "");
}
您可以使用一些LINQ
:
public static string RemoveMultiSpace(string input)
{
var indices = input
.Select((x, idx) => new { x, idx })
.Where(c => char.IsUpper(c.x))
.Select(c => c.idx);
return new string(input
.Where((x, idx) => indices.Any(c => c - 1 == idx) || x != ' ')
.ToArray());
}
也许代码看起来很复杂,但它基本上是获取大写字母的所有索引,然后过滤字母,如果空白在大写字母之前,它会包括它,否则它会删除空格。
CCD_ 9是一个工作实例。
您只需替换空格,然后在找到的第二个大写字母上插入一个。
String f = "Char lie Brow n";
f = f.Replace(" ", "");
int breakLocation = -1;
for (int i = 1; i < f.Length; i++)
{
if (f[i].ToString() == f[i].ToString().ToUpper())
{
breakLocation = i;
break;
}
}
if (breakLocation > 0)
{
f = f.Insert(breakLocation, " ");
}
MessageBox.Show(f);
这是手动执行的代码。
public static string RemoveMultiSpace(string input)
{
if (string.IsNullOrEmpty(input)) { return "Wrong input"; }
input = input.TrimEnd().TrimStart();
StringBuilder result = new StringBuilder();
for (int x = 0; x < input.Length; x++)
{
// add letter if not space or tab
if (input[x] != ' ' && input[x] != ''t')
{
result.Append(input[x]);
}
else
{
char char2Append = input[x];
char lastLetter = input[x - 1];
char firstLetter = ''0';
//find first letter of the next word
while (input[x + 1] == ' ' || input[x + 1] == ''t')
{
x++;
}
firstLetter = input[x + 1];
if (lastLetter >= 97 && lastLetter <= 122 && firstLetter >= 65 && firstLetter <= 90)
{
result.Append(char2Append);
}
}
}
return result.ToString();
}