クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

正規表現の書き方

このレッスンのあとで: 正規表現を書いて、grep -E で合う文字列を取り出せる。

50分のレッスンコマンド6件コンパイラとアーキテクチャのラボ:gcc、flex、bison、RISC-V を1台の VM で

郵便番号の形を一行で書く

正規表現とは、文字列の形をパターンで表す書き方です。入力欄での郵便番号や電話番号のチェックのように、決まった形の文字列を探すときに使います。

郵便番号は、数字3つ、ハイフン、数字4つの形です。この形を一行で書けば、grep コマンドが、合う行だけを取り出してくれます。

このレッスンのゴール

メモ

正規表現を書いて、grep -E で合う文字列を取り出せる。

重要な言葉

ことばいみれい
正規表現文字列の形を表す、パターンの書き方
文字クラス角かっこの中の、どれか1文字に合う部品[0-9]
繰り返し直前の部品が何回続くかを表す印{3}
選択2つのうち、どちらかに合う書き方cat|dog
アンカー行の先頭や末尾に合う印^ と $
grepパターンに合う行だけを出すコマンド

学生が入力するセルは、このプレビューでは空白です。

小さな部品を並べて作る

正規表現は、小さな部品を並べて作ります。ふつうの文字は、その文字自身に合います。. はどんな1文字にも合い、[0-9] は数字1文字に合います。

{3} は直前の部品が3回です。+ は1回以上、? は0回か1回、* は0回以上を表します。

正規表現の部品

書き方意味合う例
c.tc と t の間に何か1文字cat, cut
[0-9]数字1文字7
[0-9]{3}数字がちょうど3つ100
ab+a のあとに b が1つ以上ab, abbb
colou?ru は0回か1回color, colour
^[0-9]+$行全体が数字だけ2026

学生が入力するセルは、このプレビューでは空白です。

Python でも同じ書き方

コード: python
import re
# 社員番号: 英大文字1つと、数字4つ。
pattern = "[A-Z][0-9]{4}"
for text in ["A1234", "a1234", "A123", "B99999"]:
    print(text, bool(re.fullmatch(pattern, text)))
# pattern を "[A-Z][0-9]{3,4}" に変えて、もう一度実行しましょう。

grep -E でパターンを試す

grep -E は、パターンに合う行だけを出力します。printf で何行かの文字列を作り、| でつなげば、小さな実験ができます。

^ は行の先頭、$ は行の末尾です。両方を付けると、行全体がパターンに合うときだけ出力されます。

郵便番号の形を探す

コマンド
printf '100-0001\n1000001\n12-3456\n' | grep -E '^[0-9]{3}-[0-9]{4}$'

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

真ん中は何でもよい

コマンド
printf 'cat\ncot\ncut\nct\n' | grep -E '^c.t$'

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

0回か1回の u

コマンド
printf 'color\ncolour\ncolr\n' | grep -E '^colou?r$'

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

選択に合う行を数える

コマンド
printf 'cat\ndog\ncats\nbird\n' | grep -E -c '^(cat|dog)s?$'

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

^ と $ を付けないと一部に合う

(cat|dog)s? は「cat か dog、そのあとに s が0回か1回」です。-c は、合った行の数を出します。

次の Run では、同じパターンから ^ と $ を外します。余分な文字を含む行まで、出力されます。

アンカーを付けない

コマンド
printf '100-0001\nA100-00012\n' | grep -E '[0-9]{3}-[0-9]{4}'

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

よくある間違い

注意

grep は行全体を調べる、と思いがちです。実際は、行の一部に合えば、その行を出力します。行全体を調べたいときは、^ と $ で両側を縛ります。入力チェックに使うなら、必ず付けます。

正規表現は数えられない

正規表現は、有限オートマトンと同じ力しか持ちません。覚えられるのは、限られた状態だけです。

だから、開き括弧と閉じ括弧が同じ数かどうかは、確かめられません。次の Run のパターンは「( がいくつか、そのあと ) がいくつか」という形だけを見ます。

括弧の数は比べられない

コマンド
printf '(())\n(()\n()()\n' | grep -E '^\(+\)+$'

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

さらに挑戦: 電話番号

日本の電話番号の形を、正規表現で書いてみましょう。市外局番の0から始まり、数字が1〜3つ、ハイフン、数字が2〜4つ、ハイフン、数字が4つです。

printf で正しい番号と間違った番号を何行か作り、grep -E に渡して、正しいものだけが出ることを確かめましょう。

このラボとソースについて: コンパイラとアーキテクチャのラボ:gcc、flex、bison、RISC-V を1台の VM で

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。