私は少し異なるアプローチを使用します。ちょっと言い方が変わりました(そして現在VBで)が、それは簡単にカテゴリの記号や句読点や組み合わせなどのすべての種類の除外を行うことができます。また、私は正規表現を学ばなくてもいいです。
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`[email protected]#$%^&*()_+[]\{}|;':,./<>?" + "\"";
Assert.AreEqual(@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`[email protected]#$%^&*()_+[]\{}|;':,./<>?" + "\"", testObj.RemoveCategories(Strings.WhiteSpaceCategories()));
}
'@" \ s {2、} "はやや効率的です。 –
@ OlivierJacot-descombesなぜそれがより効率的になるか(本当に面白い) – JaredPar
すべての単一の空白を別の空白で置き換える必要はありません。しかし、 '\ t'を' '" 'で置き換えることはありません。 –