22
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

株式会社VISIONARY JAPANAdvent Calendar 2024

Day 18

【初学者向け】使いこなせ......正規表現っ........!!

Last updated at Posted at 2024-12-17

対象

この記事はエンジニア初学者の方に向けて記載しております。

はじめに

正規表現、勉強していますか?

特にエンジニア初学者の方は、初めての現場参画に向けて、
「言語の勉強はバッチリだぜッ!」
と意気込んでいても、正規表現の学習は疎かにしてしまい、
現場で 「くぁwせdrftgyふじこlp...」 となった方も多いかと思います。
※自分もそうでした。。。

私自身、エンジニアとして3年程経過しているのですが、
現場で働くにおいて、正規表現の知識は必須といっても過言ではありません。

もし正規表現を使わなければ、1.2時間かかる調査や作業も、
正規表現を使えば、1分で解決できちゃったりもします。

この記事を通して、
現場で使われる正規表現の活用法をしっかりとマスターしていただければと思います!

流れ

・そもそも正規表現とは
・まずは覚える。
・業務で使われる正規表現にチャレンジ!

■そもそも正規表現とは

文字列のパターンを指定して、検索や置換を行う際に使用される表記法です。
正規表現を使えばこんなことができます。

例1)
11桁の連続する数値を「3桁-4桁-4桁」に置換(検索)

56898176288
09307215360
54873905721
↓
568-9817-6288
093-0721-5360
548-7390-5721
※正規表現:

・置換(検索)対象文字列:(\d{3})(\d{4})(\d{4})
・置換後文字列:\$1-\$2-\$3

例2)
文字「world」の内、直前が「Hello」ではない「world」のみ「Japan」に置換(検索)

Hello world
Welcome to world
Go to world
↓
Hello world
Welcome to Japan
Go to Japan
※正規表現:

・置換(検索)対象文字列:(?<!Hello )world
・置換後文字列:Japan

■まずは覚える。

覚えることはそんなに多くありません!
下記サイトに綺麗にまとまっています。
1日あれば覚えられる量なのでささっと覚えちゃいましょう!
https://troutlurefishing.jp/regex.htm

サイトの内、下記だけ覚えれば十分です。
・基本的な正規表現
★これだけは全部おぼえましょう!

・定義済みの正規表現(下記だけ)
\t:タブ
\d:すべての数字
\w:英字、_、数字

・特定の位置関係の正規表現(下記だけ)
^:直後の文字が行の 先頭 にある場合にマッチ
$:直前の文字が行の 末尾 にある場合にマッチ

・置換後文字列で使える正規表現(下記だけ)
\1 ~ \9:一致文字列の1~9番目の文字列に置換

+α
・先読み・後読み
(?=pattern):直後にpatternの文字列がある(肯定先読み)
(?!pattern):直後にpatternの文字列が無い(否定先読み)
(?<=pattern):直前にpatternの文字列がある(肯定後読み)
(?<!pattern):直前にpatternの文字列が無い(否定後読み)

※下記のサイトに詳しくまとまっています。
先読みと後読みを使ったパターン

■業務で使われる正規表現にチャレンジ!

ここまでで使える手札はそろいました!
いざ業務で使われる正規表現にチャレンジしてみましょう!

問題1

下記のテキストの「@」以降の文字を抽出して下さい。

解答:

・置換対象文字列:^\w+@(.*)$
・置換後文字列:\$1

docomo.ne.jp
docomo.ne.jp
excite.co.jp
me.com
outlook.jp
yahoo.ne.jp
ymobile.ne.jp

問題2

下記のテキストの「A-B-C」を
「['name' => 'A', 'age' => 'B', 'gender' => 'C'],」
という表記に置換して下さい。

sazae-23-female
katsuo-11-male
wakame-9-female
namihei-54-male
fune-48-female
masuo-32-male
tarao-3-male
tama-1-male
norisuke-26-male
taiko-22-female
ikura-1-male
解答:

・置換対象文字列:^(\w+)-(\d+)-(\w+)$
・置換後文字列:['name' => '\$1', 'age' => '\$2', 'gender' => '\$3'],

['name' => 'sazae', 'age' => '23', 'gender' => 'female'],
['name' => 'katsuo', 'age' => '11', 'gender' => 'male'],
['name' => 'wakame', 'age' => '9', 'gender' => 'female'],
['name' => 'namihei', 'age' => '54', 'gender' => 'male'],
['name' => 'fune', 'age' => '48', 'gender' => 'female'],
['name' => 'masuo', 'age' => '32', 'gender' => 'male'],
['name' => 'tarao', 'age' => '3', 'gender' => 'male'],
['name' => 'tama', 'age' => '1', 'gender' => 'male'],
['name' => 'norisuke', 'age' => '26', 'gender' => 'male'],
['name' => 'taiko', 'age' => '22', 'gender' => 'female'],
['name' => 'ikura', 'age' => '1', 'gender' => 'male'],

問題3

下記のテキストの内、
「INSERT INTO scores...」もしくは「UPDATE scores...」
から始まる行を抽出し、それ以外の行は削除して下さい。
※1回の正規表現の置換のみでは難しいかと思うので、
置換を何回か繰り返して抽出してみてください!

INSERT INTO tests (id, name, date_of_implementation) VALUES ...
UPDATE scores SET name = ...
INSERT INTO users (id, name, gender) VALUES ...
UPDATE tests SET name = ...
UPDATE tests SET name = ...
UPDATE tests SET name = ...
INSERT INTO users (id, name, gender) VALUES ...
INSERT INTO tests (id, name, date_of_implementation) VALUES ...
UPDATE tests SET name = ...
INSERT INTO scores (id, user_id, test_id, score) VALUES ...
INSERT INTO tests (id, name, date_of_implementation) VALUES ...
INSERT INTO users (id, name, gender) VALUES ...
INSERT INTO tests (id, name, date_of_implementation) VALUES ...
UPDATE scores SET name = ...
UPDATE tests SET name = ...
UPDATE users SET name = ...
UPDATE tests SET name = ...
UPDATE users SET name = ...
INSERT INTO scores (id, user_id, test_id, score) VALUES ...
UPDATE users SET name = ...
INSERT INTO scores (id, user_id, test_id, score) VALUES ...
解答:

※あくまで解答例となります。
他にもよい方法があればコメントで教えてください!

解答例)
対象行の先頭に「★」を付ける
・置換対象文字列:^(INSERT INTO |UPDATE )(?=scores)
・置換後文字列:★\$1

対象行以外(先頭が「★」以外)の行を空行に置換
・置換対象文字列:^[^★].*$
・置換後文字列:(空欄)

空行の削除
・置換対象文字列:^\r\n
・置換後文字列:(空欄)

対象行の「★」の削除
・置換対象文字列:★
・置換後文字列:(空欄)

UPDATE scores SET name = ...
INSERT INTO scores (id, user_id, test_id, score) VALUES ...
UPDATE scores SET name = ...
INSERT INTO scores (id, user_id, test_id, score) VALUES ...
INSERT INTO scores (id, user_id, test_id, score) VALUES ...

さいごに

いかがでしたでしょうか?
私自身、正規表現を初めて学習したときに、
「こんな便利な機能があるのか!?」 と感動したのを覚えています。
この記事が、少しでも初学者の方の手助けになれれば幸いです。

22
16
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?