sikaku

正規表現メモ

かなり大味な正規表現についてのまとめです。

記述方法

基本

下記形式で記述

  • /マッチ条件/フラグ

/abc/ /abc/g /a.?c/gi

フラグ

フラグとは

マッチ条件にさらに条件付けができます。

フラグの種類
g
global
マッチ条件に当てはまる全てを対象にする
未指定時、一番最初の合致対象以外は無視される
i
ignoreCase
大文字,小文字を区別しない
m
multiline
行を対象とする
マッチ条件にて、「先頭,末尾」の指定時にそれぞれ「行頭,行末」とする
s
dotAll
マッチ条件にて、「全ての文字」の対象に改行コードを含める
u
unicode
Unicodeのサロゲートペア文字を一字として扱う

マッチ条件

一字を示す
.
全ての文字

▽例

マッチ条件を/a.c/とした場合、abcabcaびc等、.部分の文字は何でもマッチする

sフラグ未指定時、改行コード(LF,CR,u+2028,u+2029)は対象に含まない為注意

\w
半角英数字,アンダースコアのいずれか

[0-9a-zA-Z_]と同内容

\W
\w以外の全て

[^0-9a-zA-Z_]と同内容

\d
半角数字のいずれか

[0-9]と同内容

\D
\d以外の全て

[^0-9]と同内容

\s
スペース、改行等のいずれか

スペース(タブ,全角,BOM等あらゆるスペース)、改行(LF,CR,u+2028,u+2029)を対象とする

\S
\s以外の全て
\t
タブスペース(水平)
\n
改行(LF)
\r
復帰(CR)
\
次の一字を文字扱いとする

下記の、正規表現上で意味を持つ記号を文字として指定する場合に使用

-/\^$*+?.|()[]{}

▽使用例

\dという文字列にマッチさせたい

/\d/:数字にマッチしてしまう

/\\d/\dにマッチ

[]
[]内のいずれか

▽使用例

/[abc]/abcいずれかにマッチ

▽表記省略

連続する文字コード間は-で省略可

例:/[0-9a-f]/=/[0123456789abcdef]/

▽内部での正規表現の扱い

前述してきた\z形式の、一字を示すもの以外は正規表現として扱われず、ただの文字とされます。

例:/[\n\d]/:改行か数字にマッチ

例:/[(.*)]/:().*のいずれかにマッチ

このため一部記号はエスケープ不要となる。

[^]
[^]内以外のいずれか
()
()内を一字扱いし、キャプチャする

キャプチャ

()の出現順に1から番号を振り、マッチ内容を記憶する

マッチ内容の引用に有用

(?:)
(?:)内を一字扱いする、キャプチャはしない
|
|区切りでいずれか

▽使用例

/abc|def/abcdefどちらかにマッチ

/abc|def|ghi/abcdefghiのいずれかにマッチ

一部のみ分岐させたい場合は()(?:)を併用

例:/(abc|ABC)def/abcdefABCdefどちらかにマッチ

\1
キャプチャ内容にマッチした文字の引用

1はキャプチャ番号

回数の指定

回数指定は基本的に直前の一字を対象とする

一字については前述一字を示す参照

一字ではなく文字列ないしパターンに対して回数指定をしたい場合は()(?:)を利用する

例:/(abc)+/abcの繰り返しにマッチ

また、最長一致となる

最長一致
:条件に合う一番長い部分

▽例

探索対象: A子は10歳だがB子は9歳だ

一致条件: /A子.+歳/

マッチ : A子はだが10歳B子は9歳

最短一致
:条件に合う一番短い部分

▽例

探索対象: A子は10歳だがB子は9歳だ

一致条件: /A子.+?歳/

マッチ : A子は10歳

  • +
    1回以上繰り返し

    例:/ab+c/abcabbcabbbbbbbc等にマッチ

  • *
    0回以上繰り返し

    例:/ab*c/acabcabbbbbbbc等にマッチ

  • {n}
    n回繰り返し

    例:/ab{3}c/abbbcにマッチ

  • {m,n}
    m以上n以下回繰り返し

    例:/ab{2,4}c/abbcabbbcabbbbcにマッチ

    また、m,nはどちらか省略可能である

    例:{3,}:3回以上の繰り返し

      {,8}:8回以下の繰り返し

  • ?
    : 直前の一字により意味合いが変わる

    文字を示す場合:直前の一字は省略可能

    例:https?://http://https://どちらかにマッチ

    回数を示す場合:回数指定を最短一致に変更

出現位置の指定
  • ^
    先頭を示す

    ▽例

    探索対象: A子は10歳だがB子は9歳だ

    一致条件: /^.子は\d+?歳だ/

    マッチ : A子は10歳だ

  • $
    末尾を示す

    ▽例

    探索対象: A子は10歳だがB子は9歳だ

    一致条件: /.子は\d+?歳だ$/

    マッチ : B子は9歳だ

  • (?<=)
    肯定的先読み

    記述例:(?<=abc)def

    →直前がabcdefにマッチ

  • (?<!)
    否定的先読み

    記述例:(?<=abc)def

    →直前がabc以外のdefにマッチ

  • (?=)
    肯定的後読み

    記述例:def(?=abc)

    →直後がabcdefにマッチ

  • (?!)
    否定的後読み

    記述例:def(?!abc)

    →直後がabc以外のdefにマッチ

記述例

一字を示す

[a-z] 半角アルファベット小文字
[A-Z] 半角アルファベット大文字
[a-zA-Z] 全角アルファベット
[0-9] 全角数字
[ぁ-ん] ひらがな
[ァ-ヴ] カタカナ
[ヲ-゚] 半角カタカナ
\x20 半角スペース

行関係

mフラグ必須

  • ^.*?$
    一行

    ^.+?$:空行を含めない

    ^.*?\n:行末の改行コード含む

    sフラグ未指定時は?不要

  • ^[\t\x20]+
    インデント(行頭スペース)

    ^[^\S\n\r\u2028\u2029]+:より厳密な指定

  • ^$
    空行

    ^\n:行末の改行コード含む

回数の指定

abc部分を回数指定したい内容に置き換えてください。

  • ((?:abc){2})+
    偶数回繰り返し

    ((?:abc){n})+:nの倍数回繰り返し

    ((?:abc){n})*:nの倍数回繰り返し(0含む)

  • ((?:abc){2})*abc
    奇数回繰り返し

    ((?:abc){n})+(?:abc){m}:nの倍数+m回の繰り返し

汎用

  • https?:\/\/[\w\/\.\-?#=&%]*
    : url
  • \d{4}\/\d{2}\/\d{2}
    : yyyy/mm/dd (年月日)

    \d{4}-\d{2}-\d{2}:yyyy-mm-dd

    \d{4}年\d{2}月\d{2}日:yyyy年mm月dd日

    より厳密にするなら、月部分は(?:0\d|1[12])、日部分は(?:[0-2]\d|3[01])とか

そもそも正規表現とは

正規表現-Wikipedia

ざっくり言うと、文字列をパターン化したものです。

様々なプログラミング言語やoffice系含む多くのソフトにおいて、多少構文に差はありますが利用できるので覚えておいて損はないと思います。(上記解説はjavaScript及びjQuery用)

利点

平たく言うと諸々楽になります。

商品A:100円

商品B:340円

商品C:1200円

商品D:100円

上記文字列から商品毎の情報を取得する場合

文字列での指定

商品A:100円

商品B:340円

商品C:1200円

商品D:100円

商品毎の記述が必要

正規表現での指定

/.+?:\d+?円/g

これだけ

こんな感じで「ただの文字列」から情報を抽出したい際に滅法強いです。

文字列の置き換えなんかで真価を発揮するのでこちらで試してみてください。(『change』クリックでテーブルタグに変換されます)