ノベルワークスのとっしー(@tossy)です.
正規表現, ムズカシイですよね....
呪文のような見た目に思わず後退りしてしまいます.
しかし, vscodeで文字列検索する時などに, やはりあったら便利だなと思うこともあります.
今回は僕が実際に使っている超簡単な正規表現について, 備忘録的な感じで記事を書こうと思います.
もしこの記事が何かの役にったら幸いです.
"a"と'a'のマッチ
pythonやjavascriptなどの最近の言語では, 文字列はダブルクォート(")かシングルクォート(')で囲んで表すことが多いです.
変数で宣言して使うこともあれば, 次のように関数の引数に直接渡すこともありますね.
greet("hello")
しかし, 人によってはシングルクォートで書くこともあるかもしれません.
greet('hello')
もちろん, greet("hello")もgreet('hello')も同じ結果になります.
では, greet関数に文字列(hello)を代入しているプログラムを文字列検索したい場合はどうすればいいでしょうか.
通常の文字列検索であれば, ダブルクォートとシングルクォートの二つ場合に分けて検索する必要がありそうです.
しかし, ここで正規表現が活きてきます.
ポイントは, 「キャプチャ」と「後方参照」です.
パターンは以下のように書きます.
greet\((["'])hello\1\)
解説します.
まず, このままではみにくいのでいくつかの部品に分けてみます.
greet
\(
(["'])
hello
\1
\)
これらの部品のうち, 次の部品は単純な文字列マッチです.
greet
\(
hello
\)
丸括弧は正規表現では特殊な文字の扱いなので, エスケープをして文字の丸括弧だというのを明示する必要があります.
残った2つの部品 (["'])
と \1
は今回のキモです.
(["'])
と\1
はそれぞれ「キャプチャ, 文字クラス」と「後方参照」の意味を持ちます,
以下で解説します.
キャプチャについて
マッチした文字を記憶する機能です. これは後の後方参照で使用します.(グループ化の機能もありますが今回は割愛します)
丸括弧()
で囲って使います.
文字クラス
文字のいずれかと一致するパターンを作成します.
角括弧[ ]
で囲って使います.
たとえば, [abc]
だと, 文字 a
b
c
にマッチします.
後方参照について
前にキャプチャした文字列を再利用してマッチに使うことができます.
キャプチャした文字は左から順番に番号が付けられ, 順に記憶されます.
\1 や \2 のように \数字 を用いて参照することができます.
例えば, ([ab])([ab])-\2\1
はaa-aa
やab-ba
などにマッチします.
本題に戻って...
「キャプチャ」「文字クラス」「後方参照」が分かると, 今回の例の正規表現がなぜこのようになっているのかが分かってくるのではないでしょうか.
greet\((["'])hello\1\)
文字クラスで"'
を指定し, それをキャプチャします. さらに, 後方参照\1
によって以前キャプチャした文字と同じものをマッチさせることで, "hello"
か'hello'
がパターンの対象になります.
これで, greet("hello")
と greet('hello')
の両方にマッチする正規表現ができました.
これは, ""や''などの, 人によって表記揺れがあるものを検索する時に便利です. (ちゃんとルールやシステムなどで統一化したいところですが...)
他にも使いやすそうな正規表現を見つけたら, また記事にしようと思います.