テキストデータを編集する時、サクラエディタやSublime Textの正規表現置換を多用しています。
今回悩んだのは「各行の一番最初にヒットした1文字だけを置換する」パターンです。
※ 試行錯誤の結果ですので、もっとスマートな方法があれば教えてください。
具体例
次のようなデータがあるとします。
AAABAAABBAAAA
BCCCCBCCCCCCB
DBBDBDDDDDBBB
このデータ内の B を置換したいと思います。
普通に検索すれば、すべての B がヒットします。
AAA B AAA BB AAAA
B CCCC B CCCCCC B
D BB D B DDDDD BBB
しかし、今回は「各行の一番最初にヒットした B だけ」を置換したいので、次のようにヒットさせたいです。
AAA B AAABBAAAA
B CCCCBCCCCCCB
D B BDBDDDDDBBB
検索条件
次の正規表現で検索します。
(^.*?)(B)
この正規表現は、2つのグループから構成されています:
-
(^.*?): 行頭から次に指定する文字(B)までの間の最短の文字 -
(B): 指定する文字
1つ目のグループは $1 (または \1 )で、2つ目のグループは $2 (または \2 )で参照することができます。
置換
B を # に置換したい場合、次の置換文字列を指定します。
$1#
この置換文字列は、1つ目のグループの後ろの文字を # に置換せよ、という意味になります。
先ほどの検索条件で指定したとおり、1つ目のグループの後ろの文字は B になるので、結果的に B が # に置換されます。
結果
AAA # AAABBAAAA
# CCCCBCCCCCCB
D # BDBDDDDDBBB