74431


文字の使い回しで複雑な正規表現に迫られました。  
正規表現は一般テキストエディタです。

例題としては以下の場合です。

" ▼ｳｳｳｳ■ｳｳｳｳ★ｳｳｳｳ ｳｳｳｳｳ"

ｳを8に変えたいですが、単純に全部置換するのではなく、以下の条件制限があります。

理想の結果  
" ▼８８８８■８８８８★ｳｳｳｳ ｳｳｳｳ"

解決したいこと

同じ行の文字列でこのうち、"ｳ"からすると、50文字以内前方に▼か、■が、ある場合については、ｳを８の数字に置換するが、★マークか、ひとつでも全角空白があった場合以降のｳｳｳｳについては、置換せずに無視するという正規表現です。

このときにたとえ５０文字以内前方に▼や■があったとしても全角空白スペースをまたいでいる前方の場合は反応しないという条件付きです。

" ▼ ｳｳｳｳｳｳｳｳ★ｳｳｳｳ ｳｳｳｳｳ"  
この場合は全角スペースをまたいでいるのでｳは置換せず反応しない

文字の使い回しで、マークの付いたところに応じて、同じ文字なのに置換したり、してはいけなかったのするため、このような設定をせざるをえない問題が生じました。

カタカナは例え事例のため適当ですが本質的にこれと同じ問題が起きてます。

よろしくお願いいたします。


CC BY-SA 4.0
2021-03-05T09:57:22.637
74429
2021-03-07T01:06:35.103
43999
question
正規表現
複雑な条件の正規表現が生じました。この条件はどう書きますでしょうか？


コメントにもありますが、 **正規表現エンジンによって持っている機能に差異がある** ため、回答に影響します。とりあえず一例ということで

JavaScriptにもある [`(?<=)` Positive
Lookbehind](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions/Assertions#%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E8%A8%80%E6%98%8E)
を使うと表現できます。これは現在の位置の手前が一定の条件を満たしているか判定を行うものです。

> 50文字以内前方に▼か、■が、ある場合

であれば **▼か■の後ろに任意の文字が49文字以下続く** として `(?<=[▼■].{0,49})`

>
> 50文字以内前方に▼か、■が、ある場合については、ｳを８の数字に置換するが、★マークか、ひとつでも全角空白があった場合以降のｳｳｳｳについては、置換せずに無視する

であれば **▼か■の後ろに★か全角空白以外の文字が49文字以下続く** として `(?<=[▼■][^ ★]{0,49})`

ということで最終的な正規表現は `(?<=[▼■][^ ★]{0,49})ｳ` となります。


CC BY-SA 4.0
2021-03-05T14:04:35.760
74431
2021-03-07T01:06:35.103
2021-03-07T01:06:35.103
4236
4236
74429
answer