

お世話になっております。  
正規表現を使う場合で日本語の漢字文章を扱うという意味では、Boost.RegexとOnigmoは、どちらが向いているのでしょうか？  
どちらもいけるとは思うのですが、どらちらかというと○○が強いみたいなところはありますでしょうか？  
よろしくお願いいたします。


CC BY-SA 4.0
2021-03-28T17:44:30.550
74950
2021-03-28T22:35:28.960
43999
question
正規表現
正規表現を使う場合で日本語の漢字文章を扱うという意味では、Boost.RegexとOnigmoは、どちらが向いているのでしょうか？


正規表現において`.`は１文字を表します。実はこの「１文字」の定義があいまいです。漢字のように特定のパターンにおいて組み合わせを１文字と定義するマルチバイト文字への対応の有無で結果が異なってきます。１文字を正しく認識していない正規表現エンジンでは不正なバイト位置で区切ってしまい、意図しない結果を返すことになります。Unicodeであってもこの点は改善されておらず、[サロゲートペア](https://ja.wikipedia.org/wiki/Unicode#%E3%82%B5%E3%83%AD%E3%82%B2%E3%83%BC%E3%83%88%E3%83%9A%E3%82%A2)や[異体字セレクタ](https://ja.wikipedia.org/wiki/%E7%95%B0%E4%BD%93%E5%AD%97%E3%82%BB%E3%83%AC%E3%82%AF%E3%82%BF)を考慮する必要があります。

Boost.Regexは[`wchar_t`のみの対応](https://www.boost.org/doc/libs/1_75_0/libs/regex/doc/html/boost_regex/unicode.html)となります。Shift_JISやUTF-8などのマルチバイト文字は認識しませんし、サロゲートペアや異体字セレクタにも対応していません。  
Onigmoは[各種エンコーディングに対応](https://github.com/k-takata/Onigmo/blob/Onigmo-6.2.0/doc/API.ja#L106)しています。ただし、サロゲートペアや異体字セレクタへの対応状況に関するドキュメントは見つけられませんでした（ソースコードを見る限り[サロゲートペアを意識する処理](https://github.com/k-takata/Onigmo/blob/Onigmo-6.2.0/enc/utf_16be.c#L54-L80)はありそうです）。

ご自身で、どこまでを１文字と認識して欲しいかと、それに対して各エンジンの対応状況を踏まえ、不足がある場合は、ご自身で補う必要がある点まで把握した上で、正規表現エンジンを選定することをお勧めします。


CC BY-SA 4.0
2021-03-28T22:35:28.960
74951
2021-03-28T22:35:28.960
4236
74950
answer