以前、正規表現を使ったプログラムでboost::regexを使っていたところをstd::regexに置き換えた際にハマのでメモ。
C++11から導入されたstd::regexはboost::regexを土台に設計されておりクラス名も同じになっておりヘッダと名前空間を変えるだけでコンパイルは出来た。ところが、正規表現の文法に違いがあって
- boost::regexはperl
- std::regexはECMAScript
になっている。
ハマったのは任意の一文字を表す”.”が
- boost::regexは改行文字を含む
- std::regexは改行文字を含まない
という違いがあり、改行を含む文字列に対する結果が変わってしまう。
std::regexで改行文字を含む文字列をマッチさせたい場合は正規表現を変える必要があり
“.”
を
“[\s\S]”
とすれば良い。(\s, \Sはそれぞれ「空白文字」と「空白文字以外」を表す)