テキストエディタの正規表現での置き換え機能
昨今では、テキストエディタに「正規表現」を使って置き換えする機能が充実している。
Emeditorの場合
Notepad++の場合
有用性
この機能は便利で、規則性を持ったデータであれば、いろんな用途に使える:
- HTMLやXMLやjsonで出力されたファイルがあって、固定要素を追加したり、一律に変更しなくてはいけないとき
- CSVやjsonで保管されたデータがあって、そのデータを一定の規則で解析しないといけないとき
などなど
例
今回はWindowsインストーラを自動で構築できるWiXEditを使っていて発生した課題であるので取り上げる。
課題
インストーラを作るとき、デフォルトのインストールではC:\Program Files(x86)にインストールされるが、64bitのアプリケーションなのでC:\Program Files\に保存して欲しい。
なお、WixToolSetに関する修正方法については、こちらを参照
XML構成
Directory要素の一部を抽出
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFiles64Folder" Name="ProgramFiles64Folder">
<Directory Id="OPSIMULATOR" Name="OPSimulator">
<Component Id="ABP.AUTOMAPPER.DLL" DiskId="1" Guid="5606C656-4B95-43AE-966E-27F72FAEE65F">
<File Id="ABP.AUTOMAPPER.DLL" Name="Abp.AutoMapper.dll" Source="..\OPSimulator\Abp.AutoMapper.dll" />
</Component>
<Component Id="ABP.DLL" DiskId="1" Guid="F5DC937F-7270-430F-9DA0-443B23679514" >
<File Id="ABP.DLL" Name="Abp.dll" Source="..\OPSimulator\Abp.dll" />
</Component>
<Component Id="APPSETTINGS.DEVELOPMENT.JSON" DiskId="1" Guid="72B3BA58-D113-488A-9E93-2D197BEC853F">
<File Id="APPSETTINGS.DEVELOPMENT.JSON" Name="appsettings.Development.json" Source="..\OPSimulator\appsettings.Development.json" />
</Component>
... (以下省略)
ルール
このルール整理がまず大切。
どんな正規表現を使うか、パズル要素がある。
よさげなのを考えて戦略を立てるのが大切。
- Componentタグに、以下のオプションを追加したい
- Win64="yes"
- Componentタグは、常にId、DiskId、Guidの3つのオプションで構成される。
- Componentタグに含まれる特殊文字は、ピリオド、ハイフンである
正規表現を検討した結果
こんな感じになりました。
もちろん、答えは1つではないのでもっと良い方法はあります。
ただし、今回はなるべく作業を早くやりたい!
そういうときは、あまり拘らずに、↑で決めたルールだけを考えて簡易的な正規表現を使います。
正規表現の意味合い
- 検索する文字列
- Componentタグを見つけたら、その後に文字列か=か"か.か=のどれかが続く
- それが3回必ず来るので、連結して3回書く(ここはもっと上手くやればまとめられるけど、パパっとやりたかったのでコピペでやった)
- 閉じるタグとかは置換後の文字列の結果に影響するのでつけない
- 置換後の文字列
- 元の文字列を残す
- Win64="yes"を付加する
結果
無事、C:\Program Filesフォルダにインストールされたアプリ(OPSimulatorフォルダ)が保存されるようになりました