syghの新フラグメント置き場

プログラミングTipsやコード断片の保管場所です。お絵描きもときどき載せます。

末尾空白を取り除く正規表現

自分は他人の書いたソースコードを読んでいていつも気になるんですが、空白文字(ホワイトスペースやタブ)だけがずらーっと並んだ空行とか、行末尾に余計な空白文字がだらだら並んでるコードがありませんか? Visual Studioみたいにデフォルトで空白文字や改行文字が見えないエディタで編集されたとおぼしきコード、そしてそのコード片をさらにコピー&ペーストして作ったつぎはぎコードには特にそういう傾向があります。インデントも半角スペースとタブ文字が混在していることがあります。MIFESみたいな空白文字や改行文字をはっきりと分かる形で表示してくれるテキストエディタで見ると「(;´∀`)うわぁ…汚ないよ…」ってなります。Eclipseみたいに保存するときに自動的に不要な末尾空白を取り除いてくれるオプション機能があればいいんですが、そういうのがない場合は正規表現で取り除きましょう。

旧文字列:「[\t ]+$」
新文字列:「」(空文字列)

気を付けたいのは、多くの正規表現エンジンでは「\s」はホワイトスペース0x20やタブ0x09の他に全角空白U+3000はおろか改行文字0x0D/0x0Aなども含みますので、上記で文字クラスでなく「\s」を指定すると上手く動作しないということです。

ソースコード中のインデントや末尾空白はPythonとかを除いて、コンパイラにとっては特に意味はありませんが、人間にとってのインデントや空行は章節項や行間に相当します。また、印字されないデータも信号学的に言えばこれはノイズですので、不要なものは取り除いてできるかぎりクリーンにし、逆に可読性を高めコードの意味を伝える上で空白があったほうがよい場面では適宜規則的に挿入しましょう。

ちなみに自分はC/C++では基本的に下記のようなインデント規則(Visual C#のデフォルト設定とほぼ同じ)を使ってます。インデントはタブ文字派で、エディタの表示設定は2 or 4にしてます。なんでタブ文字を使っているかというと、インデントレベルをタブ文字の数で計測しやすいからです。Visual Studioは自動フォーマットした際にエディタの設定に応じてインデントをタブもしくは空白に統一してくれるので、つぎはぎするときは必ず使っています。

template<typename T> T AddVector2(const T& in1, const T& in2)
{
  return T { in1.x + in2.x, in1.y + in2.y };
}

int main(void)
{
  while (true)
  {
    break;
  }

  do
  {
    continue;
  } while (false);

  for (int i = 0; i < 99 + 1; ++i)
  {
    ;
  }

  auto func = [](double x, double y) -> bool
  {
    return x < y;
  };

  if (func(M_PI, M_E))
  {
    exit(-1);
  }
  else
  {
    goto Exit;
  }

Exit:
  return 0;
}