◆PROCESSING 逆引きリファレンス
カテゴリー:文字関連処理
文字列から余分な空白を除外するには
【解説】
文字列を扱っていると、文字列の前後にある空白(SPACE文字など)を取り除きたくなる場合があります。
PROCESSINGには、文字列の前後にある空白(を含む制御文字)を取り除くのに便利な trim() 命令があります。
【構文】
String s = trim( str );
String[] as = trim( array );
【パラメータ】
String str : 制御文字を取り除きたい文字列
String[] array :制御文字を取り除きたい文字列配列
【戻り値】
String s : 制御文字を取り除いた後の文字列
String[] as :制御文字を取り除いた後の文字列配列
【注意】
trim() は、引数で与えられた文字列の最初と最後にある空白文字を除去します。除去されるのはスペースだけではありません。文字列の前後に含まれるリターン、タブのような制御文字も除去されます。
具体的には、ASCⅡコードのうち 0x00(null文字) ~ 0x20(半角SPACE) までの制御文字が取り除かれます。
ただし、試した限りでは 0x7f(DEL)は、(見かけ上は空白文字ですが)何故か取り除かれませんでした。
なお、全角スペース、および文字列の途中に含まれる制御文字は除去されません。例えば ”_あいう_えお_” ( _は半角SPACE) の場合、trim() の結果は ”あいう_えお” になります。
文字列の前後にある全角スペース文字も除去したい場合は、自分で頑張るしかないようです。サンプルを掲載しましたので、参考としてください。
【関連記事】
- 第4章:得点を表示する(その4)
サンプルプログラム
前後の空白文字を除去する例:
1 2 3 4 5 6 7 |
String s = ""; for( int i = 0; i < 128; i++ ){ s = s + char(i); } println( "[" + trim(s) + "]" ); |
ループを回して、ASCⅡコード(0x00 から 0x7f まで)を文字列にし、trim() をかけています。
本例では、文字列の先頭に含まれる 0x00(null文字) ~ 0x20(半角SPACE) までの制御文字が取り除かれる事になります。
前後の空白文字を除去する例2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
String[] as; String[] ds; as = new String[3]; as[0] = " abc "; as[1] = "なし "; as[2] = "\tもも"; ds = trim(as); for( int i = 0; i < as.length; i++ ){ println( "[" + as[i] + "]" ); } for( int i = 0; i < ds.length; i++ ){ println( "[" + ds[i] + "]" ); } |
文字列配列に格納された各文字列から、制御文字を除去する例です。
全角スペースも除去する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
String str = " ab\tc d e\t "; String src; String dst; //初期化 println( "最初=[" + str + "]" + "(" + str.length() + ")"); src = trim(str); //まずは普通に trim dst = ""; //前方から全角SPACEと制御文字を除く //※全角SPACEだけを除くと、「全角SPACE+制御文字+普通の文字」の // 場合、結果として「制御文字+普通の文字」になってしまうので // それを防止するために、0x20を含むASC文字を独力で除去する for( int i = 0; i < src.length(); i++){ String s = src.substring(i,i+1); if( s.equals(" ") == true || s.charAt(0) < 0x21 ){ //全角SPACEまたは制御文字が続く間は、該当文字を無視する continue; } else { //全角SPACEまたは制御文字以外を見つけたら、一旦終了。 //以降の文字を dst に複写する //例:src="__ABC__" なら "ABC__"をdstに複写する dst = src.substring(i, src.length()); break; } } //後方からから全角SPACEと制御文字を除く src = dst; dst=""; for( int i = src.length(); i > 0; i-- ){ String s = src.substring( i-1, i ); if( s.equals(" ") == true || s.charAt(0) < 0x21 ){ //全角SPACEまたは制御文字が続く間は、該当文字を無視する continue; } else { //全角SPACEまたは制御文字以外を見つけたら、終了。 //先頭から、そこまでの文字を dst に複写する //例:src="ABC__" なら "ABC"をdstに複写する dst = src.substring(0, i); break; } } println( "結果=[" + dst + "]" + "(" + dst.length() + ")"); |
元の文字は
全_ab<TAB>c全d_g<TAB>全
です。
<TAB>と書かれた部分がタブ文字(\t)です。_は半角SPACE、全は全角SPACEです。
文字列の前後が全角SPACEで挟まれているため、単純に trim() しても、1つも制御文字は取り除かれません。
この文字列(src)から1文字づつ取り出して、全角SPACEだった場合は除去していきます。ただし、単純に文字列の前後にある全角SPACEだけを除去すると
_ab<TAB>c全d_g<TAB>
となってしまいます。
そこで上記のサンプルでは、文字列の前後にある全角SPACEと制御文字は全て除去するように工夫をしています。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。