正規表現を勉強する
目次
正規表現は面白い
正規表現を制するものは世界を制す。
リカルドはこれでチャンピオンになった。
は?
いや、結構言い得て妙だとは思うのだよ。
正規表現を知っていたら結構人生楽しくなるはず。
てことで、正規表現の練習をしていくきゃーのきゃーの。
ここでは正規表現の勉強なのでgrepをパイプで多段にするとかはご法度とする。
えくささーいずわーんぬっ(=Exercise 1)
りぴーとあふたーみー
とまぇーーーーーーん こ
ぐっ!
以下の州の一覧の中からAから始まる州名を検索せよ
statelist.txt
Alabama
Alaska
Arizona
Arkansas
California
Colorado
Connecticut
Delaware
Florida
Georgia
Hawaii
Idaho
Illinois
Indiana
Iowa
Kansas
Kentucky
Louisiana
Maine
Maryland
Massachusetts
Michigan
Minnesota
Mississippi
Missouri
Montana
Nebraska
Nevada
New Hampshire
New Jersey
New Mexico
New York
North Carolina
North Dakota
Ohio
Oklahoma
Oregon
Pennsylvania
Rhode Island
South Carolina
South Dakota
Tennessee
Texas
Utah
Vermont
Virginia
Washington
West Virginia
Wisconsin
Wyoming
A1
めっちゃかんたんやん。
$ grep "^A" statelist.txt
Alabama
Alaska
Arizona
Arkansas
$
すてきやん
どぅえくささいずとぅーんぐっ(=Exercise 2)
では、6文字の州を検索せよ。
A2
こんな感じ。
$ grep "^......$" statelist.txt
Alaska
Hawaii
Kansas
Nevada
Oregon
$
これだとあまりにもかっこわるい
こんなのはどう?
$ grep -P "^.{6}$" statelist.txt
Alaska
Hawaii
Kansas
Nevada
Oregon
州名のことをわかっている前提でいえば\wでもよいかも。
でも今後My BroとかC’mon!とかそういった州名が増えたら対応できないから
$ grep -P "^[\w\W]{6}$" statelist.txt
Alaska
Hawaii
Kansas
Nevada
Oregon
$
これで良いと思う。
ばらっえくささいずぅういんぐりーっちゃすりー(=Exercise 3)
さらに、このリストから名前の中にnが2回だけ使われている州を検索せよ。
A3
こんな感じかな。
$ grep -P "[Nn][\w\W]*[Nn]" statelist.txt
Connecticut
Indiana
Minnesota
Montana
North Carolina
Pennsylvania
Tennessee
Washington
Wisconsin
$
あー、これだとnが2個以上ヒットしちゃうか。
$ grep -Pi "^[^n]*[n][^n]*[n][^n]*$" statelist.txt
Connecticut
Indiana
Minnesota
Montana
North Carolina
Tennessee
Washington
Wisconsin
$
今回見やすさを重視してignorecaseオプションを付けた。
で、さらに同じ項で括れそうだ。
$ grep -Pi "^([^n]*[n]){2}[^n]*$" statelist.txt
Connecticut
Indiana
Minnesota
Montana
North Carolina
Tennessee
Washington
Wisconsin
$ grep -Pi "^[^n]*([n][^n]*){2}$" statelist.txt
Connecticut
Indiana
Minnesota
Montana
North Carolina
Tennessee
Washington
Wisconsin
$
んでぃえくささいずふおーんぬぅ(=Exercise 4)
次に、「文字列1+スペース+文字列2」となっている州を検索せよ。
ただし文字列1からはNewという文字列を省くこと。
A4
Newを抜くにはどうしたらよいか。ここがポイントかな。
$ grep -P '^(?!New)\S*\s\S*$' statelist.txt
North Carolina
North Dakota
Rhode Island
South Carolina
South Dakota
West Virginia
$
これでNew JerseyとかNew Yorkは省かれるし、仮に今後My BroやC’mon Everybody!って州が現れてもヒットすると思うし、逆にSamuel L JacksonとかMerry Christmas Mr Lawrenceという州が現れた場合も検索はされないと思う。
最後に
こうやって記事にするために実際にいろいろ勉強をした。
AIやビッグデータとか世の中の流行りの技術もいいけど、基礎中の基礎である正規表現を知っていると今後さらに面白くなると思う。