正規表現の基本

ツール

https://regex101.com/

ドキュメント

https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expression-language-quick-reference

■構文の基本

デリミタ

/ 正規表現パターン /

修飾子(mode modefire, flag)

/ 正規表現パターン /修飾子

g :global → 一番最初の結果だけでなく、できるだけ多くの結果を返す。

s:single line → 改行をワイルドカードの対象に含める。

i:大文字と小文字の区別をなくす。

m:複数行を対象にする。

u:Unicode正規表現パターンに含める。

メタ文字

* + - ! () {} [] ^ & | \ .

正規表現はメタ文字の機能をうまく使うことが出来るかにかかっている。

■メタ文字

ワイルドカード

.

一文字分を何でもカバーする。

  • .ohn → John, john, 7ohn, &ohn

正規表現はスペースも(文字の)対象にする。

角括弧

[]

一文字分の選択肢を設定する。

  • [Jj]ohn → John, john

正規表現は大文字小文字を区別する。

ハイフン

-

角括弧の中で文字数字の範囲を指定する。

  • チーム[A -Z] → チームA, チームB,チームC,チームD........チームZ
  • チーム[A-Za-z0-9]→チームA, チームa,チーム0.........[
  • [0-9]→ 1,2,3,4...9
  • [0-9][0-9]→ 10,11,12....99

キャレット

^
  1. 角括弧の中で、直後の対象範囲を逆転させる。「先頭」という意味もある。先頭でないと、逆転させる機能は発揮されない(ただの文字扱いになる)。
  2. 角括弧の外では、行頭であることを指定する。
  3. [^cd]ash → aash, eash
  4. abc→abc(最初のabcのみ)

ドルマーク

$

角括弧の外で、行末であることを指定する。

  • abc$ → abc(最後のabcのみ)
  • abc$ → abc(abc単独でなければヒットしない)

※キャレットとドルマークを使う時はm修飾を使う方が便利。

  • ^[a-z]+$→

    red

    white

    green

    black

バックスラッシュ

\

直後のメタ文字を単なる文字として扱う(ちなみにスラッシュ(/)は正規表現ではデリミタとして扱われるため、メタ文字扱いになる)。この機能を「エスケープ」と呼ぶ。

  • https:\//regex101.com\/

バックスラッシュ その他

\d = [0-9] → 0から9までの数字
\D = [^0-9] → 数字以外全て
    \w = [a-zA-Z0-9] → アルファベットと数字全て
\W = [^a-zA-Z0-9] → アルファベットと数字以外全て(記号とか)
\s = [\f\n\r\t] → スペース、改行、改行、タブ
\S = [^\f\n\r\t] → それ以外全て
\b = スペースや改行などの区切り
\B = スペースや改行、以外の区切り

※改行コードには3種類ある。

改行コード 名称 正規表現 OS
CR Carriage Return(キャリッジリターン) \r MacOS9以前のMac
LF Line Feed(ラインフィード) \n MacOSX以降、AndroidUnixLinux
CRLF Carriage Return Line Feed(キャリッジリターン&ラインフィード) \r\n Windows

よって、正規表現では3種類とも対応させる

/\r\n|\n|\r/

が良い。 参考URL:https://jill-tone.com/carriagereturn-linefeed-code/

■数量詞(quantifier)

パターンの直後に記述する。

* = アスタリスク → 0回以上
+ = プラス → 1回以上
? = クエスチョンマーク → 0回か1回
  • flavo*r

    flavor ○

    flavouuuuur ○

  • flavo+r

    flavor ✖️

    flavour ○

  • flavo?r

    flavor ○

    flavour ○

  • a\d

    a

    a1

    a12

    a123

  • a\d*

    a

    a1

    a12

    a123

  • a\d+

    a

    a1

    a12

    a123

  • a\d?

    a

    a1

    a12

    a123

◇回数の指定

{n} = n回の繰り返し
{n,} = n回以上の繰り返し(つまり、繰り返しの下限の設定)
{n,m} = 繰り返しの下限と上限の設定
  • \d{3}-\d{4}-\d{4}

    070-8956-7412

    080-9874-8641

  • [A-Z]{3}-\d{6}-[a-z]{3}-\d{4}

    SSN-643333-job-3221

◇回数の指定

数量詞のデフォルトは「最長一致(= 可能な限り範囲を広げる、ということ)」。

逆は「最短一致(=数量詞の直後に?を記述する)」。

  • ".+"

    "dogs" and "cats"

  • ".+?"

    "dogs" and "cats"

■グループ化とネスト

() =  丸括弧 → 正規表現パターンをグループ化
| = パイプ → 選択肢を設ける

([]) → 可能
[()] → グループ化不可能
  • (xyz){2}

    xyz

    xyzxyz

    xyzxyzxyz

  • (red|white|black) team

    red team

    white team

    black team

  • (山田|鈴木|佐藤)太郎|(渡邊|高橋|齋藤)次郎

    山田太郎

    鈴木太郎

    佐藤太郎

    渡邊次郎

    高橋次郎

    齋藤次郎

  • ((山田|鈴木|佐藤)太郎|(渡邊|高橋|齋藤)次郎)(さん|ちゃん)?

    山田太郎

    鈴木太郎さん

    佐藤太郎ちゃん

    渡邊次郎さん

    高橋次郎ちゃん

    齋藤次郎さん

■キャプチャ(基本)

\ 1〜9 の中で、既出の丸括弧を参照する。

一度ヒットした結果を、再利用するための仕組み。

(ab)\1

abab

(ab)(cd)\1

abcdab

(ab)(cd)\2

abcdcd

(ab)(cd)(ef)\3

abcdefef

()を使いながらも、キャプチャ機能を持たせないことも可能。

(ab)(?:cd)

キャプチャの繰り返し機能が使えるのは、正規表現パターンにではなく、ヒットした結果に対してである。

文字列が連続していることを検索する際にも使える。

  • (\w+)\1

    abc defdef

  • (\w+) \1

    abc def def

◇キャプチャ(HTML表現)

<([a-z]+[1-6]?)>.+<\/\1>

/*-- ↓↑↓↑----*/

<p>fyfgf@gdig7g56759@[hu</p>
<div>gohoiurohf983</div>
<h1>origj04b0</h1>

Visual Studio Codeでの正規表現を使った置換のやり方

[option] + [command] + [F]で置換UIを出し、青い箇所のボタンをクリック。