Month of 1月, 2012

boost::xpressive 静的正規表現で書いてみた

VS2008以後は削除されてしまったCAtlRegExpのかわりにwindowsアプリの時はboost::xpressiveを使ってきましたが、はじめて静的正規表現を使ってみました。また、xpressiveはマルチバイト文字列非対応なんで_Unicodeプリプロセッサ付きです。(普段は国際化なんて意識していないのでTCHAR.h系の関数に慣れてなくて結構イライラしました...)

boost::xpressiveのイテレータ型の対応は、boost.Xpressive(日本語訳)(すばらしい!感謝)にあります。

string::const_iterator char* const wstring::const_iterator wchar_t* const
basic_regex<> sregex cregex wsregex wcregex
match_results<> smatch cmatch wsmatch wcmatch
regex_compiler<> sregex_compiler cregex_compiler wsregex_compiler wcregex_compiler
regex_iterator<> sregex_iterator cregex_iterator wsregex_iterator wcregex_iterator
regex_token_iterator<> sregex_token_iterator cregex_token_iterator wsregex_token_iterator wcregex_token_iterato

今回はワイド文字列対応なんで、wsregexとwsmatchを使います。先にも書きましたがこれまでは(仕様さえ決まってしまえば)特に動的である必要はないのに動的正規表現を使っていた怠慢を反省し静的正規表現で書いてみました。とりあえず、現状決まっているのは、文字列を「最後の空白」空白がなければ、「最初の数字」で区切るです。

pair<wstring,wstring> split_wstr(const wstring& wstr)
{
  boost::xpressive::wsmatch matched;

  //最後の空白で分割
#ifdef _DYNAMIC_REGEX_
  boost::xpressive::wsregex regex_lastw = 
    boost::xpressive::wsregex::compile(_T("^(\\S.+)\\s(.+)$"));
#else
  boost::xpressive::wsregex regex_lastw = 
    bos >> (s1=~_s >> +_) >> _s >> (s2=+_) >> eos;
#endif
  if (boost::xpressive::regex_match(zname,matched,regex_lastw))
  {
    return pair<wstring,wstring>(matched.str(1),matched.str(2));
  }

  //最初の数字で分割
#ifdef _DYNAMIC_REGEX_
  boost::xpressive::wsregex regex_firstn = 
    boost::xpressive::wsregex::compile(_T("^(\\D+)(\\d.+)$"));
#else
  boost::xpressive::wsregex regex_firstn = 
    bos >> (s1=+~_d) >> (s2=_d >> +_) >> eos;
#endif
  if (boost::xpressive::regex_match(zname,matched,regex_firstn))
  {
    return pair<wstring,wstring>(matched.str(1),matched.str(2));
  }

  // 以下仕様に応じていろんな分割が続く
  :
}

ご覧の通り、普段perlやrubyなんかで正規表現書いている人にとっては一見わかりにくいのが弱点でしょうか?特にドットをアンダースコアにするとか*や+が前に来るなどなかなか習慣からは抜け出せないと思うので、コメントとデバグの意味を込めて動的正規表現も併記したほうが後々のためかもしれません。

エンジニアのための時間管理術

in

久しぶりに読書メモ。読書メーターでも何人かの方が書いていますがエンジニアに特化した内容じゃないです。エンジニアには13章の「自動化」のあたりが面白いかもしれませんが、まぁ、大抵のギーク連中はこんなこととっくにやっているだろうから今更感があるかもしれません。それよりも、エンジニアやSA(原題もfor System Administrators)にだけあてはまることじゃない部分、2章「集中と割り込み」あたりが面白く、ネガティブな意味じゃなくて「悪印象を与えずに追い払う」とかは僕にとっては意外と盲点だったりして、うまく実践に取り入れてみたい。PDAやオーガナイザを使おうとかちょっと古い香りのするところもありますが、逆にこの手の本にありがちなガジェットの宣伝(今ならiPhoneやアプリの紹介)っぽいのがほとんどないのも好印象。

僕自身はプログラマでありながら、社内のシステムのお守り役も兼ねているわけで大好きなプログラミングのための時間をすこしでも多く捻出するため、本書の内容をいろいろ試してみようと思う次第です。

エンジニアのための時間管理術 エンジニアのための時間管理術
Thomas A. Limoncelli 株式会社クイープ

オライリー・ジャパン 2006-10-19
売り上げランキング : 107700

Amazonで詳しく見る by G-Tools