我需要一个C#解决方案来清理一些名称,删除任何空格或标签,前导或尾随以及字符之间的特定字母。如果单词的最后一个字母和第一个字母具有相同的大小写,则删除该空格。否则留一个空间。
示例:
之前:Rob ert Pla nt
之后:Robert Plant
或
之前:Ro bert Plant
之后:Robert Plant
请注意,空格被删除,因为o和b是相同的情况,但是t和P是保留的,因为P是大写,t是较低。
到目前为止我能做的最好的是:
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
答案 0 :(得分:2)
您可以使用此正则表达式来检测两边都有小写字母的空格:
(?<=[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)", "");
}
答案 1 :(得分:1)
您可以使用某些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());
}
也许代码看起来很复杂但它基本上得到大写字母的所有索引,然后过滤字母,如果 white-space 在它包含它的大写字母之前,否则它会删除空格。
Here
是工作示例。
答案 2 :(得分:0)
您可以只替换空格,然后在找到的第二个大写字母上插入一个空格。
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);
答案 3 :(得分:-1)
这是手动执行此操作的代码。
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();
}