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で次の括弧にマッチしたパターンが取得されるためです。
