質問: 文字の使い回しで複雑な正規表現に迫られました。 正規表現は一般テキストエディタです。 例題としては以下の場合です。 " ▼ウウウウ■ウウウウ★ウウウウ ウウウウウ" ウを8に変えたいですが、単純に全部置換するのではなく、以下の条件制限があります。 理想の結果 " ▼8888■8888★ウウウウ ウウウウ" 解決したいこと 同じ行の文字列でこのうち、"ウ"からすると、50文字以内前方に▼か、■が、ある場合については、ウを8の数字に置換するが、★マークか、ひとつでも全角空白があった場合以降のウウウウについては、置換せずに無視するという正規表現です。 このときにたとえ50文字以内前方に▼や■があったとしても全角空白スペースをまたいでいる前方の場合は反応しないという条件付きです。 " ▼ ウウウウウウウウ★ウウウウ ウウウウウ" この場合は全角スペースをまたいでいるのでウは置換せず反応しない 文字の使い回しで、マークの付いたところに応じて、同じ文字なのに置換したり、してはいけなかったのするため、このような設定をせざるをえない問題が生じました。 カタカナは例え事例のため適当ですが本質的にこれと同じ問題が起きてます。 よろしくお願いいたします。
回答: コメントにもありますが、**正規表現エンジンによって持っている機能に差異がある**ため、回答に影響します。とりあえず一例ということで JavaScriptにもある `(?<=)` Positive Lookbehind を使うと表現できます。これは現在の位置の手前が一定の条件を満たしているか判定を行うものです。 > > 50文字以内前方に▼か、■が、ある場合 > > > であれば **▼か■の後ろに任意の文字が49文字以下続く** として `(?<=[▼■].{0,49})` > > 50文字以内前方に▼か、■が、ある場合については、ウを8の数字に置換するが、★マークか、ひとつでも全角空白があった場合以降のウウウウについては、置換せずに無視する > > > であれば **▼か■の後ろに★か全角空白以外の文字が49文字以下続く** として `(?<=[▼■][^ ★]{0,49})` ということで最終的な正規表現は `(?<=[▼■][^ ★]{0,49})ウ` となります。