我的字符串是这样的:
Abc , xyz , pqr
最终输出:
Abc,xyz,pqr
我想在我的字符串中遇到逗号时,从我的字中删除所有尾随空格(来自正面和结尾),但条件是如果我的字符串包含逗号或空格。
例如:
Abc pqr, ttt ooo
输出:
Abc,pqr,ttt,ooo
(单词之前或之后没有空格)
答案 0 :(得分:5)
因此所有空格和逗号都是分隔符,并且您想要删除所有连续的重复项。您可以将String.Split
与StringSplitOptions.RemoveEmptyEntries
和String.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毫秒内也是如此。