VScodeでも使える正規表現
はじめに
こんにちは、hatuna-827です。今回は「正規表現」について解説します。
記法の解説や便利な構文などを紹介します。
ただし、私の独断と偏見によってあまり使わないと判断したものは紹介・解説していません。
逆に言えば、よく使う重要なものだけが集まっていると言えますが、
もっと知りたいと思った方は他の詳しいサイトをご覧ください。
正規表現とは?
正規表現とは、一部が曖昧になっていたり複雑な条件だったりしても検索ができるような書き方のことです。
例えば、正規表現を用いることで、「◯◯で始まる」や「◯◯で終わる」を検索したり、
それらを組み合わせて「◯◯かつ◯◯」や「◯◯または◯◯」で検索したりできます。
とっても便利です。
簡単な正規表現一覧
ここで言う文字列とは、正規表現で検索する対象の文字列を指します。
それぞれ、単体で使った場合の意味です。他のものと組み合わせや\でエスケープをすることで意味が変わります。
単なる文字として扱いたい場合は、エスケープする必要があります。
^ … 行頭に一致
$ … 行末に一致
. … 任意の1文字に一致 (改行など一部の文字を除く)
+ … 直前のパターンの1回以上の繰り返しに一致 {1,}と同じ
* … 直前のパターンの0回以上の繰り返しに一致 {0,}と同じ
? … 直前のパターンの0回か1回に一致 {0,1}と同じ
| … or検索 左右いずれかの文字列に一致
() … パターンのグループ化、キャプチャ(キャプチャについて)
{} … 直前のパターンの繰り返し回数を指定
[] … 中身のいずれかの文字に一致
\ … エスケープ
\d … すべての半角アラビア数字に一致 [0-9]と同じ
\w … すべての半角英数字と_に一致 [a-zA-Z0-9_]と同じ
\s … すべての空白文字に一致 [ \t\f\r\n\v]と同じ
\n … 改行に一致
\d\w\sの大文字バージョン\D\W\Sはそれぞれ小文字バージョンの一致しない文字全てに一致します。
また、\bは単語の区切り位置を表し、\bhoge\bのように単語を挟むと単語単位で検索することができますが、VScodeではボタンで選択することができるので使わなくでもできます。
それぞれの解説・使用例・拡張的な使い方
+*?{}など繰り返し系は基本的に最も長いものに一致しますが、
後ろに?をつけることで最も短いものに一致するようになります。
+*?は直前のパターンが単一の文字か、グループかによって意味が変わります。
例えばab+はaのあとにbが1回以上続くという意味なりますが、
()を使いグループ化することで、(ab)+は1回以上のabの繰り返しという意味になります。
^
^hogeで行頭のhogeに一致します。
[]の中とエスケープを除き^が行頭の位置を表します。
$
hoge$で行末のhogeに一致します。
エスケープと置換の参照を除き行末の位置を表します。
.
aあ1 (スペース)など任意の1文字に一致します。
ただし、改行などの文字には一致しません。
+
直前のパターンの1回以上の繰り返しに一致します。
たとえば、a+はaやaaaに一致しますが、(a 0回)には一致しません。
()を使いグループ化することで、(ab)+は1回以上のabの繰り返しという意味になります。
後ろに?をつけると最短のものに一致します。
*
直前のパターンの1回以上の繰り返しに一致します。(+の0回以上版)
a*はaやaaa(a 0回)にも一致します。
+と同様グループ化を使うことができます。
後ろに?をつけると最短のものに一致します。
.と組み合わせ、.*とすると任意の長さの文字列に一致します。
?
直前のパターンの0回か1回に一致します。
ab?cはabcまたはacに一致します。
+と同様グループ化を使うことができます。
後ろに?をつけると最短のものに一致します。
|
左右いずれかの文字列に一致します。
a|bはaかbにのみ一致し、ab|cdはabかcdにのみ一致します。
グループ化を使うことで、a(b|c)dはabdかacdにのみ一致します。
()
パターンのグループ化させたり、キャプチャしたりできます。
グループ化で複数のパターンや文字を1つの塊として扱えます。
キャプチャについて{}
直前のパターンの繰り返し回数を指定することができます。
{num}でnum回ちょうどの繰り返し、
{min,max}でmin回以上max回以下の繰り返しを表します。
maxは省略することができ、{min,}はmin回以上の繰り返しを表します。
minは省略することができず、n回以下の繰り返しは{0,n}と書きます。
後ろに?をつけると最短のものに一致します。
[]
中身のいずれかの文字に一致します。文字集合とも言います。
[abc]でabcにのみ一致します。
-を用いることで範囲を表すことができ、[a-z]は半角小文字アルファベット1字に一致します。
[a-zA-Z]のように複数の範囲を表すこともできます。(半角アルファベット1字に一致)
また、^を用いることで除外文字を指定でき、[^abc]はabc以外の1字に一致します。
この2つを組み合わせ、[^a-z]で半角小文字アルファベット以外の1字に一致します。
[]の中では^と-と]以外の文字はエスケープする必要はありません。
また、[]の中の先頭でなければ、^もエスケープする必要はありません。
\
次の文字をエスケープします。
\と一致させたいときは、\\です。
\s
すべての空白文字に一致します。
.は改行に一致しないため、改行を含む任意の文字列は[\s\S]*と書きますが、
VScodeでは、行単位で検索されるため、[\s\S\n]*のように明示的に改行を含める必要があります。
キャプチャについて
パターンを()で囲むと、その範囲に一致した文字列をキャプチャし、\1や$1で参照することができます。
()の中身が?:で始まるものはキャプチャされません。(?:hoge)
また、?で始める先読みなどもキャプチャされません。
()の組み合わせの(が出る順番でキャプチャされます。
(.)*のようにキャプチャに繰り返しを使うと、繰り返しの最後の()がキャプチャされます。
例えば、(.)*はabcのabcに一致しますが、キャプチャされるのは$1 = cだけです。
検索のときは\1で参照し、置換は$1で参照します。
(.)hoge\1は同じ文字に挟まれたaを表します。
どちらも、続く数字はキャプチャが存在する範囲でなるべく長く読まれます。
$0は置換対象の文字列です。
[肯否]定[先後]読み
正規表現のように書いていますが、下の4つのことです。
- 肯定後読み
- 否定後読み
- 肯定先読み
- 否定先読み
先読み・後読みはif文のようなもので、もし直前・直後に指定したパターンがあるなら一致します。
- 肯定後読み
bar(?=foo) - 否定後読み
bar(?!foo) - 肯定前読み
(?<=foo)bar - 否定前読み
(?<!foo)bar
直後にfooがあるbarに一致します。
直後にfooがないbarに一致します。
直前にfooがあるbarに一致します。
直前にfooがないbarに一致します。
bar(?=foo)これでは直後にfooがないと一致しませんが、bar(?=.*foo)と書くことで以降にfooがあるbarに一致します。
よく使える便利な構文
.*?[\s\S\n]*^(?=foo)bar(?<=foo).*?(?=foo)
任意の改行を含まない文字列に一致します。
任意の改行を含む文字列に一致します。
しかし、これが複数回登場する場合長くなってしまうため、一度\nを!改行!などに置換し、
.*を使って置換したあとにまた、!改行!を\nに置換すると分かりやすくなります。
fooを含む行のbarに一致します。
fooに挟まれている文字列に一致します。
おわりに
正規表現を使うことで複雑な置換を一発で行うことができます。
まあ、はじめから簡単な置換でできるように変数命名などをするのが一番ですが、、
とっても便利なので、ぜひ使ってみてください。
ありがとうございました。 Dankon pro la legado.