私は少し異なるアプローチを使用します。もう少し冗長ですが (現在は 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`12334567890-=~!@#$%^&*()_+[]\{}|;':,./<>?" + "\"";
Assert.AreEqual(@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`12334567890-=~!@#$%^&*()_+[]\{}|;':,./<>?" + "\"", testObj.RemoveCategories(Strings.WhiteSpaceCategories()));
}