質問: Boost.Regex、Onigmoの正規表現についてです。 正規表現は、左から右側に向かって数えるパターンは一般的ですが、逆の文末から文字数を数えるパターンです。 置換で句読点をたくさんいれたのですが、なかには、以下のように文末の直前でも句読点がはいることになります。 事例 ``` ということで、ある。 ``` 句読点は文中にはあったほうがいいのもありますが、一律に置換するとこのようにもなりますので、あまりにも文末に近いところにつくとヘンになります。 この課題として、文末の "。" から、右から左側に10文字以内の "、" をマッチさせて消してしまうという正規表現です。 例文 ``` 自動車業界は、自動運転の方向で、法整備が進んでいるので、ある。 ``` 置換後 ``` 自動車業界は、自動運転の方向で、法整備が進んでいるのである。 ``` 10文字以内のものは一括でマッチさせたいですが、例外として、以下のパターンは除くと言う条件にしたいです。 接続が "は、" になっているところです。 事例 ``` オーストラリア大陸は、続く。 ``` 置換後 影響しない ``` オーストラリア大陸は、続く。 ``` このように文末の "。" の直前でも "は、" は例外とするというパターンです。。
回答: 一部の正規表現には先読み(`(?=...)`と`(?!...)`)という機能があります。先に読み進めることはないものの、直後に何が続いているか/続いていないかの判定が行えます。これを使うと ``` 、(?=.{0,9}。) ``` とでき、「直後の10文字以内に`。`が現れる」という条件を満たす`、`を見つけることができます。 更に後読み(`(?<=...)`と`(? > 正規表現は、左から右側に向かって数えるパターンは一般的ですが、逆の文末から文字数を数えるパターンです。 > > > 数える方向を気にされているようですが、右から数えようが左から数えようが文字数に違いはありません。 また置換について触れられていますが、正規表現はあくまで条件を満たす文字列にマッチさせるものです。どのように置換したいかはあまり関係ありません。もちろん置換方法によっては別の文字列をマッチさせた方が効率的な場合もありますが。 今回でいうと、nekketsuuuさんも指摘されていますが、置換によって文字列が短くなり、新たに条件を満たす`、`が現れることがありますが、正規表現としてはどのように置換されるかは把握していないためこのような条件にマッチさせることはできません。 少し条件を変えて「`、`以外の文字が10文字以下続く`。`」という考え方も可能ですが、残念ながらこれを表すのは無理(少なくとも私はわからない)です。