我有一个格式的字符串:abc def ghi xyz
我想以格式结束:abcdefghi xyz
做这件事最好的方法是什么?在这种特殊情况下,我可以去掉最后三个字符,删除空格,然后将它们添加回末尾,但是对于多个空格位于字符串中间的情况,这是行不通的。
简而言之,我希望删除所有单个空白空间,然后将所有多个空白空间替换为一个空白空间。这些步骤中的每一步本身都很简单,但合并起来似乎就不那么简单了。
我愿意使用正则表达式,但我不希望使用正则表达式。
发布于 2016-02-15 15:25:41
这种方法使用正则表达式,但希望以一种仍然相当可读的方式。首先,将输入字符串拆分到多个空格上。
var pattern = @" +"; // match two or more spaces
var groups = Regex.Split(input, pattern);接下来,从每个令牌中删除(单独的)空格:
var tokens = groups.Select(group => group.Replace(" ", String.Empty));最后,用单个空格连接令牌。
var result = String.Join(' ', tokens.ToArray());本例使用文字空格字符而不是‘空格’(其中包括制表符、行提要等)--如果需要拆分多个空格字符而不是实际空格,则用\s代替‘’。
发布于 2016-02-15 15:23:03
在这里,正则表达式可能是最快的,但是您可以实现一些算法,使用对单个空格的展望,然后在一个循环中替换多个空格:
// Replace all single whitespaces
for (int i = 0; i < sourceString.Length; i++)
{
if (sourceString[i] = ' ')
{
if (i < sourceString.Length - 1 && sourceString[i+1] != ' ')
sourceString = sourceString.Delete(i);
}
}
// Replace multiple whitespaces
while (sourceString.Contains(" ")) // Two spaces here!
sourceString = sourceString.Replace(" ", " ");但是,与正常的正则表达式相比,这个代码非常丑陋和缓慢.
发布于 2016-02-15 15:42:51
对于非REGEX选项,可以使用:
string str = "abc def ghi xyz";
var result = str.Split(); //This will remove single spaces from the result
StringBuilder sb = new StringBuilder();
bool ifMultipleSpacesFound = false;
for (int i = 0; i < result.Length;i++)
{
if (!String.IsNullOrWhiteSpace(result[i]))
{
sb.Append(result[i]);
ifMultipleSpacesFound = false;
}
else
{
if (!ifMultipleSpacesFound)
{
ifMultipleSpacesFound = true;
sb.Append(" ");
}
}
}
string output = sb.ToString();产出如下:
output = "abcdefghi xyz"https://stackoverflow.com/questions/35412915
复制相似问题