如何从逗号分隔的字符串中删除单词(前端和末尾空格)的所有尾随空格

时间:2014-12-09 08:21:23

标签: c# regex string

我的字符串是这样的:

Abc , xyz , pqr

最终输出

Abc,xyz,pqr

我想在我的字符串中遇到逗号时,从我的字中删除所有尾随空格(来自正面和结尾),但条件是如果我的字符串包含逗号或空格。

例如:

Abc pqr, ttt ooo

输出:

Abc,pqr,ttt,ooo

(单词之前或之后没有空格)

4 个答案:

答案 0 :(得分:5)

因此所有空格和逗号都是分隔符,并且您想要删除所有连续的重复项。您可以将String.SplitStringSplitOptions.RemoveEmptyEntriesString.Join

一起使用
string[] parts = input.Split(new []{' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
string result = string.Join(",", parts);

这是我最喜欢的,因为它具有可读性,可维护性和高效性。我已经使用60000长度的字符串和1000次重复的正则表达式方法进行了测试:

Regex:  11.68 seconds
String.Split + String.Join: 1.28 seconds

但是如果字符串非常大,您可能希望使用StringBuilder方法。

这是迄今为止最好的结果:

public static string SplitAnyKeepSingleSeparator(string input, string separator, params char[] delimiter)
{
    if(input == null) return null;
    input = input.Trim(delimiter);
    StringBuilder sb = new StringBuilder(input.Length);
    int index = 0;
    int delimiterIndex = input.IndexOfAny(delimiter);
    while (delimiterIndex != -1)
    {
        string token = input.Substring(index, delimiterIndex - index);
        sb.Append(token).Append(separator);
        index = delimiterIndex + 1;
        while (delimiter.Contains(input[index])) index++;
        delimiterIndex = input.IndexOfAny(delimiter, index);
    }
    sb.Append(input.Substring(index));
    return sb.ToString();
}

但是使用60,000个字符串时,它的效率仍低于String.Split + Join方法。

答案 1 :(得分:0)

这应该有效:)

string inputStr = "ABC, cde , fgh, IJk";
string outputStr = inputStr.Replace(' ', '');

OR

string outputStr = string.Join(",",(inputStr.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries));

答案 2 :(得分:0)

最简单和最好的表现:

    private static string SplitWordsByComma(string s)
    {
        return Regex.Replace(s.Trim(' ', ','), @"(?<=\b\w+\b)[\s,]+", ",");
    }

最快(并且适用于绑定案例):

    private static string SplitWordsByComma(string s)
    {
        var sb = new StringBuilder(s.Length);
        for (int i = 0; i < s.Length; i++)
        {
            while (i < s.Length && !char.IsLetter(s[i]))
            {
                i++;
            }
            while (i < s.Length && char.IsLetter(s[i]))
            {
                sb.Append(s[i++]);
            }
            sb.Append(',');
        }
        return sb.Remove(sb.Length - 1, 1).ToString();
    }

答案 3 :(得分:0)

试试这个..

string input = "input:plumber, plumber output:plumber,,plumber";
input = input.Replace(" ", ",").Trim();
while (input.Contains(",,")) 
{
    input = input.Replace(",,", ",");
}

...编辑

我测试了所提供的答案并与我的答案进行了比较。 (在VB.net中)

Dim input As String = IO.File.ReadAllText("C:\Users\SARVESH\Desktop\abc.txt")
Dim stp As New Diagnostics.Stopwatch
stp.Start()
input = input.Replace(" ", ",").Trim()
While input.Contains(",,")
    input = input.Replace(",,", ",")
End While
stp.Stop()
MessageBox.Show(stp.ElapsedMilliseconds)

input = IO.File.ReadAllText("C:\Users\SARVESH\Desktop\abc.txt")
stp.Reset()
stp.Restart()
input = System.Text.RegularExpressions.Regex.Replace(input.Trim(" "c, ","c), "(?<=\b\w+\b)[\s,]+", ",")
stp.Stop()
MessageBox.Show(stp.ElapsedMilliseconds)

input = IO.File.ReadAllText("C:\Users\SARVESH\Desktop\abc.txt")
stp.Reset()
stp.Restart()
Dim parts As String() = input.Split({" "c, ","c}, StringSplitOptions.RemoveEmptyEntries)
Dim result As String = String.Join(",", parts)
stp.Stop()
MessageBox.Show(stp.ElapsedMilliseconds)

测试了一串10616532个字符。

Tim Schmelter&#39;代码工作得更快......在141毫秒内完成任务。

我在512毫秒内做同样的事情。

正则表达式在1221毫秒内也是如此。