VS Codeでよく正規表現による検索や置換を行うが、通常、正規表現では1行ごとに適用されるため、複数行に渡って検索したい場合、明示的に\n
を指定する必要がある。
しかし、検索したいパターンに何行分の改行があるかわからない場合もあるため、\n
を任意回許容したいという需要がある。
具体例を見ていこう。
テキスト
ドバト カワラバト rock dove
キジバト 神
カワセミ KF
ハクセキレイ セグロセキレイ
トビ トンビ 鳶
ドバト カワラバト rock dove
キジバト 神
カワセミ KF
ハクセキレイ セグロセキレイ
トビ トンビ 鳶
このテキストでカワラバト
からトンビ
まで検索したいとする。
結論からいうと次の正規表現で検索できる。
正規表現
カワラバト[\s\S\n]*?トンビ
-
\s
: 空白文字を表す。[ \t\n\r\f]
と同じ -
\S
: 非空白文字を表す。[ \t\n\r\f]
以外の一文字。 -
\n
: 改行文字を表す。\s
で代用できそうだけど、1行ごとに検索するせいで明示的に入れないと駄目みたい。 -
*?
: 最小一致検索。この例だと2つみつかる。- ちなみに
?
を外すと最長一致検索。この例だと1つみつかる
- ちなみに
結論: 検索したい開始文字[\s\S\n]*?検索したい終了文字
で表現できる
おまけ: 検索された表現を使って置換したい場合
検索された表現を使って置換したい場合、取得したいパターンを()
で囲んで、$1
,$2
と順に取得できる。
たとえば、(カワラバト[\s\S\n]*?)神([\s\S\n]*?トンビ)
を$1God$2
で置換すると、このパターンを満たす「神」だけが「God」に置換されます。
これは、$1
で最初の括弧、$2
で次の括弧にマッチしたパターンが取得されるためです。