👌

コードを検索するための正規表現

2022/11/04に公開

tl;dr

僕が使っていて便利だった正規表現をときどき追加します。

記事で使用する基礎的なメタ文字の意味などは最後にまとめてあります。

カッコで囲まれたものを選択したいとき

(?<=class=").*?(?=")

対象 マッチする文字列
<div class="container"> container
<div class="margin-8"> margin-8
<div class="margin-8 drop-shadow"> margin-8 drop-shadow

解説

  • (?<=class=")が「後読み」と呼ばれる記法です。今回の例ではclass="が対象の文字列です。
    これはマッチする文字列の条件には含まれるが、マッチ後の選択範囲としてはこれよりが選択範囲として含まれる、というものです。
  • .*?.*で改行以外何でもござれな文字列にマッチし、?があるので最短一致になります。
  • (?=")が「先読み」と呼ばれる記法です。今回の例では"が対象の文字列です。
    これはマッチする文字列の条件には含まれるが、マッチ後の選択範囲としてはこれよりが選択範囲として含まれる、というものです。

注意点

  • スペースで区切れない: class="test-class"などであれば問題ありませんが、class="test class"のようにスペースがあるとtest classが選択されます。スペースを含む文字列は省く場合は(?<=class=")(.[^\s])*?(?=")とすれば可能です。

改行を含むワイルドカード

[\s\S]

解説

  • .は改行にマッチしない。それに対して[\s\S]はマッチする。したがってこれは複数行でのマッチに向いている

基礎知識

.

改行以外の任意の一文字にマッチします。

*

直前の文字が0文字以上繰り返すことを意味します。.*なら改行以外なんでもいい文字列です。

?

正規表現は最長一致がデフォルトです。これは、a.*aという正規表現の場合、abcaefaという文字列でバッチするのはabcaではなくabcaefaであるということです。
?を使うと最短一致になります。今回の例だとa.*?aにするとabcaがマッチするようになります。

\s

空白文字にマッチします。スペース、タブ、改行などが含まれます。

\S

\sの逆です。空白文字以外にマッチします。

Discussion