Hello Regex
膨大なプログラムファイルからsayHelloという名前のメソッドを見つけるにはどうすれば良いでしょうか。
ぱっと思いつく方法は"sayHello"
で検索することです。しかしこれではfunction sayHelloWorld
やvar _SayHello
なんていう不必要な文字列もヒットしてしまいます。
ここで便利なのが正規表現を使った検索です。
/[^0-9a-za-Z]sayHello[^0-9a-za-Z]/
で検索すれば、function sayHello
やobj.sayHello()
にヒットし、function sayHello01
やfuntion runSayHello
にはヒットしないため、目的のメソッド定義と参照箇所だけを素早く見つけることができます。
この資料では、正規表現を使って自由自在に文字列を検索したり、置換したりする方法をお伝えします。
正規表現とは
正規表現は文字列のパターンを表現するための記法で、サクラエディタやVS Codeなどのエディタ、JavaやJSなどのプログラミング言語でファイルや文字列を検索したり置換したりするときに利用できます。
例えば、1234や2023といった0-9のいずれかの文字を4回繰り返すパターンは、正規表現では/\d{4}/
または/[0-9]{4}/
のように書きます。
一般的に、説明の際に普通の検索キーワードはダブルクオーテーションで囲って"文字列"
のように表現しますが、正規表現の場合はスラッシュで囲って/正規表現/
のように表現します。
テキストエディタで検索キーワードとして入力する際は両側のスラッシュは含めないでください。
正規表現をテキストエディタの検索機能で使う
VS Code
検索キーワード入力欄のアイコン■*を押すと正規表現モードで検索できます。
アイコンAaを押すと大文字小文字が区別されるようになります。
サクラエディタ
使えると便利なケース
日付を検索する
検索キーワード:/\d{4}/\d{1,2}/\d{1,2}/
意味:4桁の数字、1または2桁の数字、1または2桁の数字がスラッシュ区切りになっている文字列
一致する文字列:2023/1/1
2023/01/1
2023/1/01
2023/01/01
一致しない文字列:2023/001/001
abcd/ef/gh
日付の書式を変更する
検索キーワード:/(\d{4})/(\d{1,2})/(\d{1,2})/
置換キーワード:"$1-$2-$3"
意味:検索キーサードの丸括弧の中にヒットした値を置換キーワードで$nとして入れることができます
置換前:2023/01/01
置換後:2023-01-01
ファイルの拡張子を取り出す
検索キーワード:/\.([a-zA-Z\d]+)$/
意味:行末がピリオド+アルファベットまはた数字の文字列
(アルファベットまたは数字の部分を丸括弧でグルーピングして取っている)
ファイル名:hogehoge.fugafuga.piyppiyo.__.csv
検索結果:csv
function getExtention(fileName) {
return fileName.match(/\.([a-zA-Z\d]+)$/)[1];
}
console.log(getExtention('hogehoge.fugafuga.piyppiyo.__.csv'));
//=> 'csv'
変数名を検索する
検索キーワード:/[^\da-zA-Z_]|^variable[^\da-zA-Z_]|$/
意味:前後がアルファベットやアンダーバーで始まらない文字列variable
一致する文字列:variable
"variable"
一致しない文字列:_variable_
avariableb
テーブル名にエイリアスのついていないSQLを検索する
検索キーワード:/FROM[\n\s]+[a-zA-Z][0-9a-zA-Z]*\s+[^a-zA-Z]/
一致する文字列:
SELECT
...
FROM
tbl1, tbl2
WHERE
...
一致しない文字列:
SELECT
...
FROM
tbl1 t1
WHERE
...
試してみよう
1.VS Codeに以下のテキストを張り付けます。
hey
heyhey
heyheyhey
heyheyheyhey
heyheyheyheyhey
2.正規表現モードで検索キーワードに以下の文字列を入力してみましょう。※両側のスラッシュは含めない
heyが2回以上続く文字列:/(hey){2}/
heyが3回以上続く文字列:/(hey){3}/
heyが2回以上、4回以下続く文字列:/(hey){2,4}/
記法
正規表現の解説記事はたくさんあるので、そちらに譲りましょう。
正規表現の解説サイト:https://city3939.com/regular-expression/
楽しいゲームサイト:https://www.regex-hunting.com/
ここでは、習うより慣れろ、で正規表現を一つ一つ自分で試しながら学習していきます。
問題集
初級 - Part1
使う正規表現:
行頭^
行末$
任意の一文字.
0回以上の繰り返し*
1回以上の繰り返し+
0または1回の繰り返し?
各正規表現の説明の後に練習問題がありますので、下記のテキストをテキストディタに張り付けて、正規表現を使って検索してみてください。
apple
apple
banana, apple
cloudy, sunny
sunny
sunny, cloudy
I make
I shake
I take
ps
ops
oops
good morning
good moorning
goood mooorning
mew
meow
meoow
I was 5 minutes late
I was 10 minutes late
I was 100 minutes late
Sorry, I was 10 minutes late
I was 10 minutes late, sorry
資料の最後に答えがあります。
答え合わせしやすいように検索を試すエディタと自分の答えを張っておくエディタの二つを開いておくと良いでしょう。
【行頭】
行頭は^
で表します。
例えば、行頭がabcで始まる文字列は/^abc/
です。
練習問題1:行頭がappleで始まる文字を検索してください
【行末】
行末は$
で表します。
例えば、行末がabcで終わる文字列は/abc$/
です。
練習問題2:行末がsunnyで終わる文字を検索してください
【 任意の一文字】
任意の一文字は.
で表します。
例えば、a●b(●は任意の一文字)という文字列は/a.b/
です。
練習問題3:I ●ake
(●は任意の一文字)という文字列を検索してください
【0回以上の繰り返し】
0回以上の繰り返しは*
で表します。
例えば、eが0回以上繰り返される文字列hy, hey, heeyなどは/he*y/
です。
練習問題4:oooops
(oは1回以上繰り返される)という文字列を検索してください
【1回以上の繰り返し】
1回以上の繰り返しは+
で表します。
例えば、heeellooo(eとoは1回以上の繰り返し)という文字列は/he+llo+/
です。
練習問題5:goood mooorning
(oは2回以上の繰り返し)という文字列を検索してください
【0または1回の繰り返し】
0または1回の繰り返しは?
で表します。
例えば、ac, abc(bは無いか、一文字だけある)という文字列は/ab?c/
です。
練習問題6:meow
(oが無いか、oは一文字だけある)という文字列を検索してください
⇓ランクアップ問題⇓
練習問題7:行頭Iで始まり行末がeで終わり、文字列中で0が1回以上繰り返される文字列を検索してください
初級 - Part2
使う正規表現:
数字\d
いずれか一文字[abc]
アルファベット小文字[a-z]
アルファベット大文字[A-Z]
n回数繰り返し{n}
n回以上繰り返し{n,}
x回数以上、y回数以下繰り返し{x,y}
各正規表現の説明の後に練習問題がありますので、下記のテキストをテキストディタに張り付けて、正規表現を使って検索してみてください。
Version:1-1-1
Version:1-10-1
Version:2-3-4
file1
file3
file8
file9
stick
stack
stock
lowercase a
lowercase z
lowercase A
lowercase Z
uppercase a
uppercase z
uppercase A
uppercase B
uppercase G
uppercase Y
uppercase Z
loooooooool
looooooooool
loooooooooool
wow
woow
wooow
woooow
cofe
coffe
coffee
cofffffee
coffeeee
【数字】
数字は\d
で表します。
例えば、file1~file9は/file\d/
です。
練習問題1:Version:●-●-●(●は任意の数字)という文字列を検索してください
練習問題2:file●
(●は3-8の数字いずれか)という文字列を検索してください
【いずれか一文字】
いずれか一文字は[abc]
で表します。
例えば、book, hookは/[bh]ook/
です。
練習問題3:st●ck
(●はiまたはo)という文字列を検索してください
【アルファベット小文字】
アルファベット小文字は[a-z]
で表します。
例えば、a1~z1は/[a-z]1/
です。
練習問題4:lowercase ●
(●はアルファベット小文字)という文字列を検索してください
【アルファベット大文字】
アルファベット大文字は[A-Z]
で表します。
例えば、a1~z1は/[A-Z]1/
です。
練習問題5:uppercase ●
(●はB~Yのいずれか一文字)という文字列を検索してください
【n回数繰り返し】
n回数繰り返しは{n}
で表します。
例えば、goooood(oが5つ)は/go{5}d/
です。
練習問題6:looooooooool (oが10個)という文字列を検索してください
【n回以上繰り返し】
n回以上繰り返しは{n,}
で表します。
例えば、oops, ooooops(oは最低2回以上)は/o{2,}ps/
です。
練習問題7:wooow (oが最低3回以上)という文字列を検索してください
【x回数以上、y回数以下繰り返し】
x回数以上、y回数以下繰り返しは{x,y}
で表します。
例えば、moon, moooon(oが2回以上4回以下繰り返す)は/mo{2,4}n/
です。
練習問題8:coffee (fとeは2回以上4回以下繰り返す)という文字列を検索してください
答え
初級 - Part1
練習問題1:/^apple/
練習問題2:/sunny$/
※6行目のsunnyは行末にスペースが入っているのでマッチしません
練習問題3:/I .ake/
練習問題4:/oo*ps/
初級 - Part2
練習問題4:/lowercase [a-z]/
※大文字小文字区別のモードにする