string.Trim
メソッドとは
C# string.Trim
メソッドは文字列の前後の「空白」を削除するメソッドです。
単語の両端に空白(空白とも呼ばれます)が含まれる単語になってしまう可能性があります。
文字列の最初と最後から、文字の配列で指定された空白または文字を削除します。
ただ、一口に「空白」といっても半角スペース・全角スペース・タブ、改行コード...などさまざま空白が存在します。
取り除かれる「空白」は具体的にどの文字を指しているのか?
string.Trim
メソッドで取り除かれる「空白」はChar.IsWhiteSpace
にマッチする文字を指します。
空白文字は Unicode 標準で定義されています。この Trim メソッドは true、Char.IsWhiteSpace メソッドに渡されたときの戻り値を生成する先頭と末尾の文字をすべて削除します。
Char.IsWhiteSpace がマッチする文字は下記の通りです。
- Members of the UnicodeCategory.SpaceSeparator category, which includes the characters SPACE (U+0020), NO-BREAK SPACE (U+00A0), OGHAM SPACE MARK (U+1680), EN QUAD (U+2000), EM QUAD (U+2001), EN SPACE (U+2002), EM SPACE (U+2003), THREE-PER-EM SPACE (U+2004), FOUR-PER-EM SPACE (U+2005), SIX-PER-EM SPACE (U+2006), FIGURE SPACE (U+2007), PUNCTUATION SPACE (U+2008), THIN SPACE (U+2009), HAIR SPACE (U+200A), NARROW NO-BREAK SPACE (U+202F), MEDIUM MATHEMATICAL SPACE (U+205F), and IDEOGRAPHIC SPACE (U+3000).
- Members of the UnicodeCategory.LineSeparator category, which consists solely of the LINE SEPARATOR character (U+2028).
- Members of the UnicodeCategory.ParagraphSeparator category, which consists solely of the PARAGRAPH SEPARATOR character (U+2029).
- The characters CHARACTER TABULATION (U+0009), LINE FEED (U+000A), LINE TABULATION (U+000B), FORM FEED (U+000C), CARRIAGE RETURN (U+000D), and NEXT LINE (U+0085).
なぜ調査したのか
ここからは補足で、なぜ上記の調査をしたか記述いたします。
見た目上問題ないのに電話番号がエラー
外部から連携される電話番号が問題ないように見えるのに正規表現にマッチせずバリデーションエラーになっていました。
電話番号の文字列の先頭でカーソルキーが滑るので、先頭にゼロ幅スペース(Zero Width Space U+200B
)があると考えました。
ただ、string.Trim
してもエラーが出続けました。
そこで、具体的に「空白」判定される文字(char
)は何なのか調べることにしました。
電話番号のエラーの原因はなんだったのか
電話番号の文字列の Unicode を確認しました。
すると先頭に双方向テキストの「左から右への埋め込み」(Left-To-Right Embedding U+202A
)というものが付いていました。
string.Trim
にはChar
型の配列を引数に取るオーバーロードもあります。
U+202A
も取り除くようにして最終的に解決しました。
phoneNumber = phoneNumber.Trim().Trim(new[] { 'U+202A' })
※Char
型の配列を引数に取るオーバーロードメソッドは「空白」のトリム処理は行われないのでTrim
を2度呼び出しています。