1. ホーム
  2. Web プログラミング
  3. 正規表現

正規表現による文字列の一括置換を行うイデアの方法

2022-01-17 19:23:28

会社のプロジェクトコードは、最初の頃の荒っぽい展開のせいで、マジックナンバーのようなidがたくさん書き残されていて、今となってはメンテナンスが困難な状態になっています。そこで、これらのidを静的変数に置き換えるという仕事を任されました。

このidが十数個、10個のファイルに分散しており、合計60個以上あるので、手作業で探して置き換えるのは不可能に近いです。

Ideaでは、メニューバーのEdit->find->replace in pathで、プロジェクトのすべてのファイルの内容を検索して置き換えることができる、完全なファイル検索機能を開くことができるのです。

ここで、abcdは書き込まれたデッドIDである、次のようなコードになります。

文字列 id="abcd".equals(str);

と置き換えること。

文字列 id=ConstantService.getBy("abcd").equals(str);

普通のマッチなら、"String id=ConstantService.getBy(\"") で検索して、それを "String id=ConstantService.getBy(\") に置き換えればいいと思うんだ。

しかし、プロジェクトには、この "String id=""" という形式のコードがたくさんあり、共通にマッチすると、誤って他のコードを傷つけてしまう可能性が高いのです。

そこで、レギュラーマッチングを使います。ということです。右の*"アイコンをクリックすると、レギュラーマッチモードが表示されます。

置き換えが必要なコードは、次のようなマッチングパターンに一致します。

String id="(\w+)\".equals(str);

に置き換えることができます。

文字列 id=ConstantService.getBy("$1").equals(str);

マッチパターンに含まれる書き込み禁止IDは \"(\w+)\" で表すことができます。一番外側はエスケープされたクォーテーションマークです。括弧内は一致グループを表し、▼はその文字に一致し、+はその文字が1回以上出現することを表します。このようなパターンは、プロジェクトで死んだIDを書くことと一致します。

置換文字列の$1は、マッチ文字列の最初のマッチグループを表します。つまり、idを一つずつ指定するのではなく、置換文字列が結果的にマッチしたidを自動的に置き換えるのです。

こうして、この想像を絶するほど複雑な作業は簡単に解決される。

この記事では、正規表現を使って文字列を一括置換するアイデアについてご紹介していますが、文字列を一括置換するアイデア正規表現については、スクリプトハウスの過去記事を検索するか、引き続き以下の関連記事を閲覧してください。