我有一个字符串,其中单词之间有未知组合的空格字符(\t
, \n
或空格)。例如:
string str = "Hello \t\t \n \t \t World! \tPlease Help.";
我想把每个内部空格字符序列替换为一个空格:
string str = "Hello World! Please Help.";
.NET提供内置方法来执行此操作吗?如果没有,我该如何使用C#执行此操作?
我有一个字符串,其中单词之间有未知组合的空格字符(\t
, \n
或空格)。例如:
string str = "Hello \t\t \n \t \t World! \tPlease Help.";
string str = "Hello World! Please Help.";
.NET提供内置方法来执行此操作吗?如果没有,我该如何使用C#执行此操作?
using System.Text.RegularExpressions;
newString = Regex.Replace(oldString, @"\s+", " ");
string original = ...;
string replaced = Regex.Replace(original, @"\s+", " ");
这将把每组连续的空白字符(\s
)替换为一个空格。你可以在这里找到其他有用的字符组。
Imports System.Runtime.CompilerServices
Imports System.Globalization
Imports System.Text
Public Module StringExclusions
<Extension()> Public Function CharsToString(ByVal val As IEnumerable(Of Char)) As String
Dim bldr As New StringBuilder()
bldr.Append(val.ToArray)
Return bldr.ToString()
End Function
<Extension()> Public Function RemoveCategories(ByVal val As String, ByVal categories As IEnumerable(Of UnicodeCategory)) As String
Return (From chr As Char In val.ToCharArray Where Not categories.Contains(Char.GetUnicodeCategory(chr))).CharsToString
End Function
Public Function WhiteSpaceCategories() As IEnumerable(Of UnicodeCategory)
Return New List(Of UnicodeCategory) From {UnicodeCategory.SpaceSeparator, UnicodeCategory.LineSeparator, UnicodeCategory.Control}
End Function
'...Other commonly used categories removed for brevity.
End Module
还有一些测试。
[TestMethod]
public void RemoveCharacters()
{
String testObj = "a \a b \b c \f d \n e \r f \t g \v h";
Assert.AreEqual(@"abcdefgh", testObj.RemoveCategories(Strings.WhiteSpaceCategories()));
}
[TestMethod]
public void KeepValidCharacters()
{
String testObj = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`12334567890-=~!@#$%^&*()_+[]\{}|;':,./<>?" + "\"";
Assert.AreEqual(@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`12334567890-=~!@#$%^&*()_+[]\{}|;':,./<>?" + "\"", testObj.RemoveCategories(Strings.WhiteSpaceCategories()));
}
string trimmed = Regex.Replace(original, @"\s+", " ");
没有内置的方法可以实现这一点,但是您可以使用正则表达式:
string result = Regex.Replace(str, @"\s+", " ");
您可以尝试一种不使用正则表达式的更快速的替代方法:
string replaced = String.Join(" ", str.Split(
new char[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries));
最快且通用的方法是这样做(行终止符、制表符也将被处理)。不一定需要正则表达式强大的功能来解决这个问题,但正则表达式可能会降低性能。
String
.Join
(" ",
new string
(stringToRemoveWhiteSpaces
.Select
(
c => char.IsWhiteSpace(c) ? ' ' : c
)
.ToArray<char>()
)
.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries)
)
\t
替换为" "
。 - Olivier Jacot-Descombes\t
以保持OP所概述的语义。虽然不是100%清楚,但这就是我的理解。 - JaredPar@"\s{2,}|\t|\n"
。然而,这可能并不值得复杂化。 - Olivier Jacot-Descombes